class base
{
public:
base(int ival, string sval) : ival1(ival), sval1(sval)
{};
void print();
private:
int ival1;
string sval1;
};
class mid1 : public virtual base
{
public:
void print();
//protected权限的构造函数,专门为虚拟继承的子类使用。
protected:
mid1()
{};
};
class mid2 : public virtual base
{
protected:
mid2()
{};
};
class derive : public virtual mid1, pubilc virtual mid2
{
public:
//在derive的构造函数中,正常是不能调用祖父基类的,只能调用父基类,但是虚拟继承,可以。
//初始化的顺序是从最上层的虚基类的构造函数开始逐层向下知道派生类自己,如果有多个虚基类,则按照派生时的先后顺序。
//析构函数与构造函数的顺序相反。
derive(int ival, string sval) : base(ival, sval), mid1(), mid2()
{};
};
derive *pDer = new derive(1, "OK");
pder->print();
//call 的是mid1 :: print(), but not base :: print(),mid1是base的派生类。
//如果mid2也有print那么需要加上范围修饰符,否则仍然二义性。
derive derObj = new derive(2, "error");
derObj.print(); //二义性,因为不是pointer,不具备多态,所以base和mid1冲突。