2016-04-21 4 views
-1

Я понимаю, что если мы хотим вызвать деструктор нашего производного объекта, который был назначен указателю на базу, мы хотим сделать базовый деструктор как виртуальным. Однако, если у нас было что-то вроде этого:Virtual Destructor C++

#include <iostream> 
using namespace std; 
class base 
{ 

public: 
base() { cout << "Base Constructor Called\n"; } 
virtual ~base() { cout << "Base Destructor called\n"; } 

}; 
class derived1 :public base 
{ 

public: 
derived1() { cout << "Derived1 constructor called\n"; } 
~derived1() { cout << "Derived1 destructor called\n"; } 

}; 

class derived2 : public derived1 
{ 
public: 
derived2() { cout << "Derived2 constructor called\n"; } 
~derived2() { cout << "Derived2 destructor called\n"; } 

    }; 

class derived3 : public derived2 
{ 
    public: 
derived3() { cout << "Derived3 constructor called\n"; } 
~derived3() { cout << "Derived3 destructor called\n"; } 

}; 

и мы имеем главную функцию:

int main(){ 
base* ptr=new derived3; 
delete ptr; 

и выход:
Base Constructor Called Derived1 constructor called Derived2 constructor called Derived3 constructor called Derived3 destructor called Derived2 destructor called Derived1 destructor called Base Destructor called

это вызывает базу, Derived1, производные2 и производные3 деструкторы, которые работают отлично. мы только сделали базовый деструктор виртуальным.
Почему нет необходимости создавать производные 1 и 2 деструкторы как виртуальные для получения одинаковых результатов?

+3

Я [отправил этот ответ] (http://stackoverflow.com/a/36760987/440558) всего пару часов назад с кавычками из спецификации C++, в которой говорится, почему он не нужен для дочерних классов. Последняя цитата - та, которую вы должны прочитать. То же самое относится к * всем * функциям-членам, если базовый класс объявляет его виртуальным, тогда он также является виртуальным во всех дочерних классах. –

ответ

2

Все классы, полученные из класса с виртуальным деструктором, имеют неявные виртуальные деструкторы.

Это относится к любой функции-члену в вашей иерархии классов.

+0

, скажем, мы сохраняем объект производного3 с ** производным1 ** указателем, который не имеет явно объявленного виртуального dtor. Будет ли тогда базовый класс dtor вызываться ** delete **? –

+0

@AndrewLavq Этот ответ говорит «да». – juanchopanza

2

Как только вы объявляете функцию virtual, она неявно остается virtual во всех производных классах.

+0

Разве это не справедливо только для деструктора? – Rotem

+0

@Rotem nope! :) – Quentin

+0

Интересно, я не знаю, почему я предположил, что опускание 'virtual' на переопределенном методе в производном классе запечатывает метод. – Rotem