多重继承的构造函数和析构函数的执行顺序(包含虚基类)

mac2026-09-01  6

下面示例就是说明多重继承析构函数和构造函数的执行顺序:

#include <iostream> using namespace std; class A { public: A(int i) { cout << "父类A构造函数被调用:" << i<<endl; } virtual ~A() { cout << "父类A虚构函数被调用:" << endl; } }; class B { public: B(int i) { cout << "父类B构造函数被调用:" <<i<< endl; } virtual ~B() { cout << "父类B虚构函数被调用:" << endl; } }; class C : public A, virtual public B { public: C(int i,int j,int k,int l):A(l),B(i),b1(j),a(k) { cout << "C子类构造函数被调用" << endl; } ~C() { cout << "C子类虚构函数被调用:" << endl; } A a; B b1; }; int main() { cout << "B类是C类的虚基类,A类是C类的非虚基类" << endl; cout << "----------下面是执行顺序------------" << endl; A *pa = new C(1,2,3,4); delete pa; system("PAUSE"); return(0); }

运行结果: 结论: 继承构造函数的执行顺序是:先基类,再子对象成员,最后是派生类。析构函数则与之相反。当多重继承时,如有继承虚基类,那么构造的顺序是,虚基类先于非虚基类。再就是,子对象成员的构造顺序跟它们的声明顺序有关,跟初始化参数列表无关。

注: 1、虚基类的作用是消除二义性 2、当父类指针指向子类对象,如果基类的析构函数不是虚析构函数,那么释放对象时不会执行派生类析构函数,virtual ~Base() { cout << “Base Destructor”<<endl; }即可执行派生类的析构函数。

最新回复(0)