Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
#1

virtual функции - C++

07.02.2013, 18:20. Просмотров 2662. Ответов 32
Метки нет (Все метки)

я как-то пропустил лекцию по этой теме, и теперь совсем не понимаю назначение этих функций.
может кто поделиться ссылкой и нормальными примерами по этой теме?
и да, я умею пользоваться гуглом, и вводил "virtual функции с++", читал, и не понял ничего
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 18:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос virtual функции (C++):

Protected abstract virtual base pure virtual private destructor - C++
Хай, all) Вопрос не для начинающих и дурацкий) В разделе для экспертов публиковать не стал, чтобы не засорять его) Наткнулся тут на...

Возвращаемое значение virtual функции - C++
В инструкции указанно следующее virtual int getHost() создаю у себя в классе int getHost(){ return ?? }

Про перегрузку функции и Virtual в классах - C++
В общем вообще запутался с этим ООП... Вот есть в классе функция, перегрузка функции даёт возможность этой функции иметь несколько...

Зачем в конце объявления виртуальной функции ноль: virtual void show()=0 ? - C++
Здравствуйте. Что значат строки? И есть ли в них разница? virtual void show()=0; virtual void show(); Может ли быть такая запись? ...

Виртуальные функции (нужно ли во всех производных классах писать слово virtual?) - C++
Нужно ли во всех производных классах писать слово virtual? Или достаточно только один раз в базовом классе указать что функция...

Не работает virtual - C++
Вот написал пробный код, он не срабатывает: #include <iostream> using namespace std; class A{ public: virtual int c(); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 20:08 #16
Цитата Сообщение от ValeryS Посмотреть сообщение
дозволяется в С
а в плюсах
C++
1
int main()
спасибо, об этом я не знал. в книгах часто видел такую запись.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 20:08  [ТС] #17
Цитата Сообщение от Пёс Посмотреть сообщение
Tiva, так, ещё раз....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
class A
{
public:
    virtual void F()
    {
        cout << "A::F()" << endl;
    }
};
class B : public A
{
public:
    void F()
    {
        cout << "B::F()" << endl;
    }
};
void main()
{
    A* pointerTypeA = new B(); /*Прошу обратить внимание на тип указателя и на тип объекта*/
    pointerTypeA->F();
    system("pause");
}
Попробуйте так. А потом сотрите "virtual" и сравните.
получается из такого указателя (тип А, а память выделена В) - нельзя вызвать методы класса В. Спрашивается - для каких целей нужен полиморфизм(я читал определение на вики, но не понятно все равно, не надо цитировать вики)
или для каких целей можно использовать этот "недоуказатель"?

я так понимаю, смысл появляется когда весь класс и наследники переводятся на виртуальные функции, и только?
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 20:10 #18
Цитата Сообщение от Tiva Посмотреть сообщение
получается из такого указателя (тип А, а память выделена В) - нельзя вызвать методы класса В. Спрашивается - для каких целей нужен полиморфизм(я читал определение на вики, но не понятно все равно, не надо цитировать вики)
или для каких целей можно использовать этот "недоуказатель"?

я так понимаю, смысл появляется когда весь класс и наследники переводятся на виртуальные функции, и только?
Такой указатель нужен, когда вы используете функции, которые будут подходить для всех типов, которые наследуются от A. В этом весь сок полиморфизма.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 20:12  [ТС] #19
Цитата Сообщение от Пёс Посмотреть сообщение
Такой указатель нужен, когда вы используете функции, которые будут подходить для всех типов, которые наследуются от A. В этом весь сок полиморфизма.
кажется я не понимаю эту фразу, точнее "подходить для всех типов" - эта фраза приводит мои мысли к шаблонам, но ведь это не то. чего-то я не до понимаю
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
07.02.2013, 20:15 #20
Цитата Сообщение от Tiva Посмотреть сообщение
получается из такого указателя (тип А, а память выделена В) - нельзя вызвать методы класса В. Спрашивается - для каких целей нужен полиморфизм(я читал определение на вики, но не понятно все равно, не надо цитировать вики)
у тебя есть класс фигура из него наследуется треугольник и квадрат и круг

ты создал массив фигур (разных)
а теперь надо их все нарисовать
если бы не было полиморфизма то пришлось бы проверять какая у тебя фигура и вызывать её метод рисования
а так все просто
C++
1
2
for(int i=0;i<100;i++)
   figure[i]->Draw();
а полиформизм сам разберется где рисовать круг треугольник или квадрат
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
07.02.2013, 20:18  [ТС] #21
ммм, спасибо, кажется в моей голове начало что-то складываться ))

Добавлено через 1 минуту
а вот еще вопрос, последний
в родительском классе virtual void print()=0
это значит что это виртуальная функция, но она ничего не делает? т.е. её нельзя вызвать(или её вызов из родит класса ничего не сделает), а указывает, что в наследниках есть переопределенные функции. правильно? нечто прототипа
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 20:22 #22
Тут нужно понять сначала саму суть наследования. Само понятия, что B является так же и типом A. То есть с ним можно обращаться так же, как и с типом A. Виртуальная функция нужна, например, для специфического поведения объекта производного класса.

Добавлено через 2 минуты
Tiva, Это называется чисто виртуальная функция. Есть классы, которые просто описывают общий интерфейс для производных классов, которые уже сами будут определять поведение.

На фигурах конечно не рекомендуются изучать наследование. Но раз уж начали, то можно было создать класс, который бы просто назывался Фигура, и у него как раз была бы чисто виртуальная функция sho() или draw().
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
07.02.2013, 20:27 #23
Цитата Сообщение от Tiva Посмотреть сообщение
в родительском классе virtual void print()=0
это значит что это виртуальная функция, но она ничего не делает? т.е. её нельзя вызвать(или её вызов из родит класса ничего не сделает), а указывает, что в наследниках есть переопределенные функции. правильно?
не совсем это называется чисто виртуальная функция
класс содержащий её называться абстрактный класс
он кстати может содержать несколько чистых виртуальных функций

объект создать от абстрактного класса нельзя

вот представь что в моем примере ты пытался бы создать объект фигура
но он ничего не знает ни о радиусе ни о количестве углов, в общем такая аморфная фигура

значит создаем абстрактный класс и от него детей квадрат круг .......
единственная задача класса будет управлять рисованием

Добавлено через 1 минуту
C++
1
2
3
4
5
6
class CFigure
{
 public:
virtual void Draw()=0;
 
}
Пёс
228 / 76 / 4
Регистрация: 03.02.2013
Сообщений: 311
07.02.2013, 20:29 #24
Tiva,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
class A
{
    char p1;
 
public:
    A()
    {
        p1 = 'A';
    }
    virtual void print()
    {
        cout << p1 << endl;
    }
    
};
class B : public A
{
    char p2;
public:
    B()
    {
        p2 = 'B';
    }
    void print()
    {
        cout << p2 << endl;
    }
};
int main()
{
    A* pointersTypeA[10]; /*Прошу обратить внимание на тип указателя и на тип объекта*/
    for(int i=0; i<10; i++)
        if(i%2 != 0)
            pointersTypeA[i] = new A();
        else
            pointersTypeA[i] = new B();
    for(int i=0; i<10; i++)
        pointersTypeA[i]->print();
 
    system("pause");
    return 0;
}
Добавлено через 1 минуту
Пока писал, уже ответили )))
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
07.02.2013, 20:30 #25
Цитата Сообщение от Toshkarik Посмотреть сообщение
На фигурах конечно не рекомендуются изучать наследование.
А че это не рекомендуется
как раз видна иерархия
Фигура
__ Многоугольник
_____Треугольник
_____Четырехугольник
________Квадрат
__Овал
____Элипс
_______Круг
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,244
Записей в блоге: 3
Завершенные тесты: 1
07.02.2013, 20:32 #26
Возможно, из этого примера Вам станет понятно как происходит вызов виртуальных функций(примерно):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
class A{
protected:
    void (A::*virptr)();
    void foo(){
        std::cout<<"class A"<<std::endl;
    }
public:
    A(){
        this->virptr=&A::foo;
    }
    void virfunc(){
        (this->*virptr)();
    }
    int x;
};
 
class B:public A{
    void foo(){
        std::cout<<"class B"<<std::endl;
    }
public:
    B(){
        this->virptr=(void (A::*)())&B::foo;
    }
};
 
int main(){
    A * a=new A;
    A * b= new B;
    a->virfunc();
    b->virfunc();
}
Здесь кривая, но "ручная" виртуальная функция )))
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 21:25 #27
Цитата Сообщение от ValeryS Посмотреть сообщение
__Овал
____Элипс
_______Круг
Хотя бы из за этого. С каких пор круг является овалом и элипсом? Или элипс овалом? Люди путаются в определениях.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
07.02.2013, 21:40 #28
Цитата Сообщение от Toshkarik Посмотреть сообщение
С каких пор круг является овалом и элипсом? Или элипс овалом?
Вообще то меня учили что эллипс это частный случай овала а круг частный случай эллипса
или что то поменялось в геометрии ?
никто не мешает тебе создать свою иерархия
или ты считаешь, что абстракте объяснение класс А является наследником класса Б, более понятно?
ну тогда могу предложить еще одну иерархию

Млекопитающие
__Человек
____Женщина
____Мужчина
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
07.02.2013, 22:12 #29
ValeryS, изучающий наследование должен понять смысл отношения является. Должна быть какая то логика.

Цитата Сообщение от ValeryS Посмотреть сообщение
что эллипс это частный случай овала а круг частный случай эллипса
А меня учили, что эллипс и овал разные фигуры. Как и круг. Частными случаями и овала и эллипса является окружность, никак не круг.

Наследование лучше изучать на реальных вещах и их абстракциях. Как например транспорт, автомобили и тд.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
07.02.2013, 22:19 #30

Не по теме:

Цитата Сообщение от Toshkarik Посмотреть сообщение
является окружность, никак не круг.
согласен ступил
бытовое значение окружности привел(круг)
как обычно говорят "Нарисуй круг"


Цитата Сообщение от Toshkarik Посмотреть сообщение
А меня учили, что эллипс и овал разные фигуры.
Материал из Википедии — свободной энциклопедии
Овал (фр. ovale, от лат. ovum — яйцо) ― плоская замкнутая выпуклая C²-гладкая кривая (при этом под выпуклостью понимают свойство кривой иметь с любой прямой не более двух (действительных) общих точек).

Простейшим примером овала является эллипс (в частности, окружность).
Цитата Сообщение от Toshkarik Посмотреть сообщение
Наследование лучше изучать на реальных вещах и их абстракциях. Как например транспорт, автомобили
Ну и чем это лучше?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2013, 22:19
Привет! Вот еще темы с ответами:

Virtual и noreturn - C++
Возможно ли подружить virtual и noreturn? Пишу: struct test { int func(){error();} ]virtual void error(){throw 0;} }; ...

Virtual Protect - C++
Хочу установить защиту на весь регион памяти dll , но нечего не выходит , при просмотре через редактор памяти , атрибуты те же остаются ,...

тупняк с virtual :) - C++
Здравствуйте. пытаюсь прикрутить икслючения к своему &quot;модулю&quot;, и натыкаюсь на ругань компилятора: error: expected unqualified-id before...

Virtual метод - C++
Разбираю основы С++. Застрял на понятии virtual. Во всех источниках написано что это все сделано чтобы потомок родительского класса мог...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.02.2013, 22:19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru