关于virtual function的作用我就不再赘述了。总之,就是让子类可以重新定义一个和基类同名的函数,并且不用考虑会把基类的覆盖掉。
我原先以为 virtual destructor根virtual function一样,就是如果你不加virtual的话,那么derived class中的destructor就会把base class给覆盖了,结果发现,你不加virtual的话,根本就看不到derived class的destructor
考虑下面代码:
#include iostream.h
class Base
{
public:
Base(){ cout<<"Constructing Base";}
// this is a destructor:
~Base(){ cout<<"Destroying Base";}
};
class Derive: public Base
{
public:
Derive(){ cout<<"Constructing Derive";}
~Derive(){ cout<<"Destroying Derive";}
};
void main()
{
Base *basePtr = new Derive();
delete basePtr;
}
输出结果是:
Constructing Base Constructing Derive Destroying Base
坑爹啊,derived class根本就看不到自己的destructor,这个跟普通虚函数是反着的。普通虚函数是如果你不加virtual,那我的派生类的同名函数就把基类的给覆盖了。但是destructor是只看得到祖宗的,看不到自己的。
我发现真是越复习越发现自己原先理解的不对。其实这个跟普通virtual function不冲突,因为basePtr是一个基类的指针,所以按理说他只能看到自己类里的成员函数,所以如果你不加virtual的话,那只能看到基类的destructor,从而无法访问derived class的destructor。所以要有virtual destructor。 这样基类指针就能看到derived class的destructor
本文探讨了虚析构函数的概念及其实现原理。通过对比普通虚函数,解释了为何需要在基类中声明虚析构函数,以确保派生类的析构函数能够被正确调用。使用C++代码示例说明了当通过基类指针删除派生类对象时,如果不将基类的析构函数声明为虚函数,则只会调用基类的析构函数。
2867

被折叠的 条评论
为什么被折叠?



