关于virtual的析构函数解决方案

关于virtual的析构函数

加virtual是为了继承来多态的

不是说析构函数不能被继承吗?

------解决方案--------------------
如果析构函数不用virtual,则
Base *p = new Derive();
delete p;
这里delete p删除的就是Derive类中的Base成份了,而对于Derive成员则无法删除,所以为了正确删除,则必须用virtual析构函数,具体请参考effective c++ 3td
------解决方案--------------------

C++对象的结构中,如果有虚函数,就会有一个虚函数表,这个大家都知道,而析构函数会放在虚函数表的第二个索引位置,第一个索引位置是放type_info的,用来支持RTTI.不管是什么类,都是如此.析构函数的多态和普通函数不同,而且每个类只有一个析构,这能保证多态的调用条件,它本身就不是用继承来实现的,所以你不用觉得奇怪.
------解决方案--------------------
1> > > > 我上面理解的对不对?
2> > > > 为什么 若没有virtual,delete p;就少调用一个析构函数?
3> > > > 为什么若有virtual,delete p;就调用两个析构函数?
==============
一个派生类的析构函数最后是会自动调用基类的析构函数的.这就象派生类构造函数在一定条件下会自动调用基类的无参构造函数一样.
如果一个基类析构函数置为virtual,那么派生类并不是说会继承基类的析构函数,而是会继承 "虚 "的机制,派生类析构也会置为virtual. 此时,当一个基类指针实际指向派生类,在delete的时候,发生的是动态绑定,正确调用到派生类的析构函数,但派生类的析构函数只会析构派生类新增加的部分,从基类继承的部分,要靠基类的析构函数来析构,而基类的析构函数是由派生类析构函数执行完毕时自动调用的.
相反,如果基类析构函数不为虚,派生类析构函数也就不为虚.当一个基类指针实际指向派生类,在delete的时候,发生的是静态绑定,编译器根据指针的类型直接绑定到基类析构函数,自然派生类的析构函数就不会被调用.

并不是所有用于继承的类的析构函数都要置为virtual,只有 有多态目的的基类的析构函数才置为virtual.