C++中虚析构函数

参考:C++中的动态类型与动态绑定、虚函数、运行时多态的实现_IIcyZhao's Road-CSDN博客

参考:C++中虚析构函数的作用及其原理分析_哒哒的博客-CSDN博客_虚析构函数的作用

动态绑定与静态绑定

动态绑定:就是基类的指针或引用有可能指向不同的派生类对象。

对于非虚函数,执行时实际调用该函数的对象类型即为该指针或引用的静态类型(基类类型)

只有虚函数才能进行动态绑定,非虚函数不进行动态绑定。

#include<iostream>
using namespace std;

class ClxBase
{
    public:
        ClxBase() {};
        virtual ~ClxBase() { cout<<"delete ClxBase"<<endl; };

        virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl;  };

};

class ClxDerived : public ClxBase
{
    public:
        ClxDerived() {};
        ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl;  };

        void DoSomething() { cout << "Do something in class ClxDerived!" << endl;  };

};

int main(int argc, char const* argv[])
{
     ClxBase *pTest = new ClxDerived;
     pTest->DoSomething();
     delete pTest;
    return 0;
}

一般在开发过程中的基类的析构函数需要写为virtual函数,

原因是有一种异常情形:当通过多态,把派生类对象指向基类,再去delete这个对象,也就是上述的delete pTest; 删除的是基类的指针。而且这个基类和派生的析构函数没有关系(不是virtual的),子类和父类的析构函数没有动态绑定, 所以只会调用基类的析构函数,不调用派生类的析构函数而多态中:基类的析构函数与派生类的析构函数并没有绑定到一起。所以会使得父类的析构函数不被调用。

猜你喜欢

转载自blog.csdn.net/m0_37844072/article/details/120964153