1、如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构,所有直接或间接
的派生类都必须在构造函数的成员初始化列表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员
2、建立一个对象时,如果这个对象中含有从虚基类继承的成员,则虚基类的成员是由最远派生类的构造函数通过调
用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用可以自动忽略
3、如果同一层次中同时包含虚基类和非虚基类,应该先调用虚基类的构造函数,再调用非虚基类的构造函数,最后
调用派生类的构造函数
class X:public Y,virtual public z{
};
X one
4、对于多个虚基类,构造函数的执行顺序是先左后右,自上而下
5、对于非虚基类,构造函数的执行顺序是先左后右,自上而下
6、如果虚基类由非虚基类派生,则仍然先调用基类构造函数,再调用派生类的构造函数
#include <iostream>
using namespace std;
class Base
{
public:
Base(int sa){
a = sa;
cout<<"Base"<<endl;
}
protected:
int a;
};
class Base1:virtual public Base
{
public:
Base1(int sa,int sb):Base(sa)
{
b = sb;
cout<<"Base1"<<endl;
}
private:
int b;
};
class Base2: virtual public Base
{
public:
Base2(int sa ,int sc):Base(sa)
{
c = sc;
cout<<"Base2"<<endl;
}
private:
int c;
};
class Derived:public Base1,public Base2
{
public:
Derived(int sa,int sb,int sc,int sd):Base(sa),Base1(sa,sb),Base2(sa,sc){
d = d;
cout<<"Derived"<<endl;
}
private:
int d;
};
int main(){
Derived obj(2,4,6,8);
return 0;
}
Base的构造函数只执行一次,当类Derived的构造函数调用虚基类Base的构造函数之后,类Base1和类Base2对类
Base的构造函数的调用被忽略。这是初始化虚基类和初始化非虚基类的区别