class A //定义一个类A
{
public:
A(){cout << "A called"<< endl;}
void print(){cout << "A print" <<endl;}
private:
};
class B //定义一个类 B
{
public:
B(){cout << "B called" << endl;}
void print(){cout << "B print" << endl;}
private:
};
class C :public A , public B //定义一个类C 分别继承自 A ,B
{
public:
C(){}
private:
};
int main(void)
{
C c;
c.print(); // 看看类A和类B的定义, 在这里编译器不知道要调用那个父类的print()方法。
// 应该这样调用:c.A::print()或者 c.B::print() ;
getchar();
return 0;
}
//
class A
{
public:
A(){cout << "A called"<< endl;}
void print(){cout << "A print" <<endl;}
private:
};
class B : public A
{
public:
B(){cout << "B called" << endl;}
private:
};
class C : public A
{
public:
C(){cout << "C called" << endl;}
private:
};
class D:public B,public C
{
public:
D(){cout << "D called" << endl;}
private:
};
int main(void)
{
D d;
d.print(); // 在这里编译器也不知道调用那个A的print方法(B的父类还是C的父类).
// 应该这样调用:c.B::print()或者 c.C::print() ;
getchar();
return 0;
}
// 解决以上两种情况的另一种方法
//
class B : virtual public A
{
public:
B(){cout << "B called" << endl;}
private:
};
class C : virtual public A
{
public:
C(){cout << "C called" << endl;}
private:
};
这样就相当于说,在没有A类的拷贝时就构造一个,如果已经有了,就用已经有的那一个,这样一来,拷贝只有一份了,二义性消除了。
//
使用虚拟继承:虚拟继承又称作共享继承,这种共享其实也是编译期间实现的,当使用虚拟继承时,上面的程序将变成下面的形式:
#include <iostream.h>
#include <memory.h>
class CA
{
int k;
public:
void f() {cout << "CA::f" << endl;}
};
class CB : virtual public CA // 也有一种写法是class CB : public virtual CA
{ // 实际上这两种方法都可以
};
class CC : virtual public CA
{
};
class CD : public CB, public CC
{
};
void main()
{
CD d;
d.f();
}