(1)任何 虚拟基类的构造函数按照它们被继承的顺序构造;(#add 即声明顺序)
(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
(3)任何成员对象的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数。
例如:
//**********************
//** ch17_4.cpp **
//**********************
#include<iostream.h>
class OBJ1
{
public:
OBJ1(){ cout <<"OBJ1\n"; }
};
class OBJ2
{
public:
OBJ2(){ cout <<"OBJ2\n"; }
};
class Base1
{
public:
Base1(){ cout <<"Base1\n"; }
};
class Base2
{
public:
Base2(){ cout <<"Base2\n"; }
};
class Base3
{
public:
Base3(){ cout <<"Base3\n"; }
};
class Base4
{
public:
Base4(){ cout <<"Base4\n"; }
};
class Derived :public Base1, virtual public Base2,
public Base3, virtual public Base4
{
public:
Derived() :Base4(), Base3(), Base2(),
Base1(), obj2(), obj1()
{
cout <<"Derived ok.\n";
}
protected:
OBJ1 obj1;
OBJ2 obj2;
};
void main()
{
Derived aa;
}
运行结果为:
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok.
Derived的虚基类Base2和Base4最先构造,尽管它在Derived类中出现的顺序不在最前面;Derived的非虚基类其次构造,不管它在Derived构造函数中出现的顺序如何;Derived的组合对象obj1和。obj2随后构造, 它以类定义时,数据成员排列顺序为准, 不管在Derived构造函数中出现顺序怎样;最后是Derived类构造函数本身。
->在语言中实现多继承并不容易,这主要是编译程序问题,还有模糊性问题。建议你如果可能,在进一步阅读有关参考书之前,尽量避免用多重继承。单个继承提供了足够强大的功能,不一定非用多重继承不可。我们应先学会阅读一些商品化的类库源程序中有关多重继承的部分,因为那些都是经过测试的安全代码。