Здорова господа!
Я тут начал задумываться, что же такое виртуальные деструкторы? Читал, что виртуальных конструкторов не бывает, а могут быть только виртуальные деструкторы, но что это я вроде тогда и не понял так. Вообщем в этом посте попытаемся разобраться с виртуальными деструкторами, что это и зачем они нужны.
Я подсмотрел в интернете зачем создается виртуальный деструкто. Да для того чтобы не было утечки памяти. Щас я вам продемонстрирую на примере. От допустим у нас есть код:
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 |
//virtual6nui dectruktor #include <iostream> using std::cout; using std::endl; class A { public: A(){cout <<"konstruktor A"<<endl;} ~A(){cout <<"dectruktor A"<<endl;} }; class B : public A { public: B(){cout <<"konctryktor B"<<endl;} ~B(){cout <<"dectryktor B"<<endl;} }; int main() { B b; return 0; } |
Вывод этого кода следующий:
1 2 3 4 |
konstruktor A konctryktor B dectryktor B dectruktor A |
Все правильно выводиться но когда мы денамически выделяем память через указатель на базовый класс, то у нас уже выводится не так, от код функции main() через указатель на базовый класс:
1 2 3 4 5 6 7 |
int main() { A* b=new B; delete b; return 0; } |
от при таком создании объекта у нас выводится следующее:
1 2 3 |
konstruktor A konctryktor B dectruktor A |
То есть, где то у нас потерялся деструктор класса B, чтобы этого не происходило нужно в базовом классе A сделать деструктор виртуальным. И все проблем с этим не будет все будет правильно работать.
Вообщем господа существует еще правило если в базовом классе есть виртуальная функция, то обязательно создается и виртуальный деструктор.
[youtube]http://www.youtube.com/watch?v=F4pi1lTphws[/youtube]