|
发表于 2021-3-9 01:15:02
|
显示全部楼层
1>>>>我上面理解的对不对?
2>>>>为什么 若没有virtual,delete p;就少调用一个析构函数?
3>>>>为什么若有virtual,delete p;就调用两个析构函数?
==============
一个派生类的析构函数最后是会自动调用基类的析构函数的.这就象派生类构造函数在一定条件下会自动调用基类的无参构造函数一样.
如果一个基类析构函数置为virtual,那么派生类并不是说会继承基类的析构函数,而是会继承"虚"的机制,派生类析构也会置为virtual. 此时,当一个基类指针实际指向派生类,在delete的时候,发生的是动态绑定,正确调用到派生类的析构函数,但派生类的析构函数只会析构派生类新增加的部分,从基类继承的部分,要靠基类的析构函数来析构,而基类的析构函数是由派生类析构函数执行完毕时自动调用的.
相反,如果基类析构函数不为虚,派生类析构函数也就不为虚.当一个基类指针实际指向派生类,在delete的时候,发生的是静态绑定,编译器根据指针的类型直接绑定到基类析构函数,自然派生类的析构函数就不会被调用.
并不是所有用于继承的类的析构函数都要置为virtual,只有 有多态目的的基类的析构函数才置为virtual. |
|