虚析构函数

我要把最重要的这句话放在前面:

除非你知道自己在做什么,否则只要有子类的基类,基类析构函数都加上 virtual 

 

举个栗子

看这样一个代码

class Father
{
private:
        /* data */
public:
        Father(/* args */);
        ~Father();
        void fun()
        {
                cout<<"Father fun"<<endl;
        }
};

Father::Father(/* args */)
{
}

Father::~Father()
{
        cout<<"Father boom"<<endl;
}

class Child:public Father
{
private:
        /* data */
public:
        Child(/* args */);
        ~Child();
        void fun()
        {
                cout<<"Child fun"<<endl;
        }
};

Child::Child(/* args */)
{
}

Child::~Child()
{
        cout<<"Child boom"<<endl;
}


int main()
{
        Father *p = new Child;
        p->fun();
        delete p;
        return 0;
}

后面delete掉的时候,自然是父类和子类都要释放,但是执行结果却是这样的

Child fun
Father boom

没有执行子类的析构函数

所以我们在父类的析构函数定义为虚析构函数

class Father
{
private:
        /* data */
public:
        Father(/* args */);
        virtual ~Father();
        virtual void fun()
        {
                cout<<"Father fun"<<endl;
        }
};

这样再重新执行代码

Child fun
Child boom
Father boom

 

如果继承的父类的子类有同名函数,那么要看这个指针类型,指针是父类类型的,就调用父类的函数

posted @ 2020-04-10 10:41  祁峰_1024  阅读(132)  评论(0编辑  收藏  举报