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

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

Войти
Регистрация
Восстановить пароль
 
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
#1

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

14.06.2014, 19:24. Просмотров 293. Ответов 2
Метки нет (Все метки)

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

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++
Есть базовый класс Cell (код можно даже не смотреть - он просто для иллюстрации -&gt; вопрос внизу) class Cell { friend class Obstacle;...

наследование и виртуальные ф-ии - C++
НЕ у кого нет такой программы? хотя бы похожей Написать программу, в которой создается иерархия классов. Включить полиморфные объекты...

Наследование и виртуальные функции - C++
Доброго времени суток. Есть два вопроса: 1) Подскажите, плиз, что делаю не так. Есть базовый класс human и класс наследник solder....

Наследование и виртуальные функции - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace std; #include &lt;iomanip&gt; izdanie *izdanie::begin=0; ...

Наследование и виртуальные функции - 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
130 / 130 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
14.06.2014, 20:02 #3
Попробуйте
C++
1
2
Russ *lv = new English;
lv->Surname();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2014, 20:02
Привет! Вот еще темы с ответами:

Наследование и виртуальные функции - C++
Всем здарова. Есть пару косяков в коде, но я их не могу найти. Быть может вы найдёте их? Вот код: /*Разработайте и реализуйте...

Наследование и виртуальные функции - C++
Получить практические навыки создания иерархии классов и использования статических компонентов класса. Подскажите пожалуйста, как убрать...

Наследование и виртуальные функции - C++
Общая постановка. Программа должна содержать: - базовый класс Х, включающий два элемента х1, х2 типа int, - конструктор с параметрами...

Наследование и виртуальные функции - C++
Скажите, часто ли вы при проектирование реальных программ используете наследование?


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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