参考: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的),子类和父类的析构函数没有动态绑定, 所以只会调用基类的析构函数,不调用派生类的析构函数而多态中:基类的析构函数与派生类的析构函数并没有绑定到一起。所以会使得父类的析构函数不被调用。