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

Наследование и виртуальные методы - C++

Восстановить пароль Регистрация
 
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
14.06.2014, 19:24     Наследование и виртуальные методы #1
Начал разбираться с темой наследование и не совсем понимаю как наследуются виртуальные методы, конструкторы и деструкторы виртуальные и нет. Поэтому возникло несколько вопросов. Почему говориться, что конструкторы и деструкторы не наследуются, но при этом в случае ниже вызываются оба деструктора для подкласса.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Base {
 public:
     virtual ~Base() { cout << " Base's destructor" << endl; }
};
 
class Derived : public Base {
    public:
     ~Derived() { cout << " Derived's destructor" << endl; }
};
 
void main()
{
     Derived* b = new Derived;
     delete b;
}
И как правильно создавать объект в каких ситуациях "Derived* b = new Derived;" и в каких "Base* b = new Derived;" ?

Если я правильно понял, то подкласс не может изменить функцию если она не виртуальная, но почему в этом случае разницы никакой нет?

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
class Russ {
    public:
        ~Russ() {
            cout << "Good Bye WORLD!!!" << endl;
        }
        void Name() {
            cout << "Russ VOID Name!" << endl;
        }
        virtual void Surname() {
            cout << "Russ VIRTUAL VOID Surname!" << endl;
        }
};
 
class English : public Russ {
    private:
        int Y;
    public:
                void Name() {
            cout << "English VOID Name!" << endl;
        }
                virtual void Surname() {
            cout << "English VIRTUAL VOID Surname!" << endl;
        }
};
 
void main () { Russ *lv = new Russ;
                    English *en = new English;
 
                    lv->Name();
                    lv->Surname();
 
                    en->Name();
                    en->Surname();
 
                    delete en;
                    delete lv;
}
Как я понял в подклассах и вовсе не имеет смысла писать virtual?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2014, 19:24     Наследование и виртуальные методы
Посмотрите здесь:

наследование и виртуальные ф-ии C++
Наследование и виртуальные методы C++
Наследование. Виртуальные методы/деструкторы. C++
C++ Наследование. Виртуальные функции
Виртуальные функции и наследование C++
C++ Наследование и виртуальные функции
Наследование и виртуальные ф-ии задание C++
Наследование и виртуальные функции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_script_
169 / 137 / 34
Регистрация: 01.05.2012
Сообщений: 414
14.06.2014, 19:42     Наследование и виртуальные методы #2
Цитата Сообщение от Дантe Посмотреть сообщение
Почему говориться, что конструкторы и деструкторы не наследуются, но при этом в случае ниже вызываются оба деструктора для подкласса.
При создании объекта наследника вызываются конструкторы всех базовых классов. И при уничтожении его деструктор и всех базовых.

Добавлено через 2 минуты
Цитата Сообщение от Дантe Посмотреть сообщение
И как правильно создавать объект в каких ситуациях "Derived* b = new Derived;" и в каких "Base* b = new Derived;" ?
В случае Base* b = new Derived; доступны методы только базового класса, но выполняться они будут так как реализованы в наследнике, если переопределены. В этом случае b может указывать на объект любого наследника и на объект самого Base.
recoder
 Аватар для recoder
129 / 129 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
14.06.2014, 20:02     Наследование и виртуальные методы #3
Попробуйте
C++
1
2
Russ *lv = new English;
lv->Surname();
Yandex
Объявления
14.06.2014, 20:02     Наследование и виртуальные методы
Ответ Создать тему
Опции темы

Текущее время: 17:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru