2013-04-28 2 views
3

Я смущен о виртуальных деструкторах. Я прочитал много вопросов и объяснений, но я до сих пор не понял, что если есть производный класс из базового класса, мне нужно реализовать его собственный деструктор, даже если он не имеет каких-либо специальных операций.Базовый класс 'Виртуальный деструктор C++

Компилятор компилирует приведенный ниже код, но будут ли какие-либо утечки памяти или какие-либо проблемы? не

Class Base{ 
public: 
virtual ~Base(){} 
}; 

Class Derived : public Base{ 
// do i need a special destructor here for Derived ? 
} 

Base *foo; 
foo = new Derived; 
delete foo; 
+0

http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors/15903538#15903538 попробуйте эту ссылку –

ответ

2

Если вы не предоставили деструктор для Derived, то он создается автоматически. Этот автоматически созданный деструктор переопределяет деструктор в Base, поэтому он вызывается при удалении foo. Автоматически создается деструктор будет эквивалентно следующему:

Class Derived : public Base { 
    ~Derived() { } // this is what you get if you don't provide your own. 
} 

Все деструкторов, являются ли они автоматически создаются или нет, будет автоматически вызывать деструкторы всех членов класса и деструктор базового класса. Так что все хорошо очищается.

+0

, так что нет необходимости писать '~ Производные() {}' внутри ' Derived', поскольку он автоматически вызван и не выполняет какие-либо операции, верно? – 2013-04-28 17:56:17

+0

@CastielMartin: это правильно –

+0

большое спасибо. – 2013-04-28 17:59:51

1

Нет там не будет никаких утечек памяти, так как Derived получит это неявное виртуальный деструктор.