如果一个类从两个不同的类里继承两个同名的成员,则需要在派生类中使用类限定符来区分他们。
即在从A和B派生出来的c类中使用a::Show()和B::Show()来区分从这两个类那里继承的show()方法
如果一个类通过多种途径继承了一个非虚基类,则该类从每种途径分别继承非虚基类的一个实例。多个基类
都是有问题的。使用虚基类的MI,当派生类使用关键字virtual来指示派生时,基类就成为虚基类:
class A:public virtual B
{}
主要变化是,从虚基类的一个或多个实例派生而来的类将只继承了一个基类。对实现这种特性,必须满足其他要求:
1》有间接虚基类的派生类包含直接调用间接基类构造函数的构造函数,这对于间接非虚基类来说是非法的;
2》通过优先规则解决名称二义性。
MI会增加编程的复杂程度,然而这种复杂性主要是由于派生类通过多条途径继承同一个基类引起的。避免这种情况后
唯一需要注意的是必要时对继承的名称进行限定
#include<iostream> using namespace std; class A { int a; public: A(int n=0):a(n) { cout<<"A"<<endl<<" int a="<<a<<endl; }; }; class B:public virtual A { int b; public: B(const A & a,int m=0,int n=0):A(n),b(m) { cout<<"B"<<endl<<" int b="<<b<<endl; }; }; class D:public virtual A { int d; public: D(const A & a,int m=0,int n=0):A(n),d(m) { cout<<"D"<<endl<<" int d="<<d<<endl; }; }; class C :public B,public D { int c; public : /*C(const A & a ,int q=0,int m=0,int n=0):B(a,m,n),D(a,m,n),c(q) { cout<<"C"<<endl<<" int c="<<c<<endl; };*/ //上边将通过两种不同的途径把a传递给A这会有二义性 //c++在使用虚基类时禁止信息通过中间类自动传递给基类 //因此上面的构造函数将初始化B类的bw但和D类的d,a不会传递给子对象b也不会传递给D对象 //会调用A的默认无参构造函数 //所以必须在构造派生对象之前构造基类对象组件,如果不希望默认构造函数来构造虚对象,则需要显式地调用 //所需基类构造函数因此应该这样 C(const A & a ,int q=0,int m=0,int n=0):A(a),B(a,m,n),D(a,m,n),c(q) { cout<<"C"<<endl<<" int c="<<c<<endl; }; //上述代码将显示的调用A(const A &)这样做是合法的,对于虚类必须这样做,对于非虚基类,则是非法的。 //如果类有间接虚基类,除非只需使用该虚基类的默认构造函数,否则必须显式地调用该虚基类的某个构造函数 }; int main() { A * a=new A(1); //D(a,1,2); C c(*a,1,2,3); cin.get(); }