派生类初始化顺序


#include<iostream>
using namespace std;

class B1
{
public:
B1()
{
cout << "call B1" << endl;
}
};

class V1 : public B1
{
public:
V1()
{
cout << "call V1" << endl;
}
~V1()
{
cout << "call ~V1" << endl;
}
};

class D1 : virtual public V1
{
public:
D1()
{
cout << "call D1" << endl;
}
~D1()
{
cout << "call ~D1" << endl;
}
};

class B2
{
public:
B2()
{
cout << "call B2" << endl;
}
~B2()
{
cout << "call ~B2" << endl;
}
};

class B3
{
public:
B3()
{
cout << "call B3" << endl;
}
~B3()
{
cout << "call ~B3" << endl;
}
};
class V2 : public B1, public B2
{
public:
V2()
{
cout << "call V2" << endl;
}
~V2()
{
cout << "call ~V2" << endl;
}
};

class D2 : virtual public V2 ,public B3
{
public:
D2()
{
cout << "call D2" << endl;
}
~D2()
{
cout << "call ~D2" << endl;
}
};

class M1
{
public:
M1()
{
cout << "call M1" << endl;
}
~M1()
{
cout << "call ~M1" << endl;
}
};
class M2
{
public:
M2()
{
cout << "call M2" << endl;
}
~M2()
{
cout << "call ~M2" << endl;
}
};

class X : public D1,public D2
{
public:
X()
{
cout << "call X" << endl;
}
~X()
{
cout << "call ~X" << endl;
}
M1 m1_;
M2 m2_;
};


void main()
{
X b;

}

输出:
call B1
call V1
call B1
call B2
call V2
call D1
call B3
call D2
call M1
call M2
call X
析构函数于此相反。

X对象各子对象的构造顺序如下:
1.首先:构造虚基子类对象:
构造V1:B1::B1()V1::V1()
构造V2:B1::B1() B2::B2() V2::V2()
2.其次,构造非虚基类子对象:
构造 D1:D1::D1()
构造 D2:B3::B3() D2::D2()
3.再次,构造所有成员:
M1::M1()
M2::M2()
4. 构造X本身:
X::X()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值