内容来源: 传智播客
上面继承关系中,b1类与b2类同时继承自b类,c类继承自b1类与b2类。
所以当调用b类时,c++编译器不知道b类成员变量等到底是来源于b1还是b2类,会导致二义性,引起失败。
#include<iostream>
using namespace std;
class B {
public:
int b=3;
void print1() {
cout << "b = " << b << endl;
}
};
class B1 : public B {
public:
int b1=1;
void print2() {
cout << "b = " << b << endl;
}
};
class B2 : public B {
public:
int b2=1;
void print3() {
cout << "b = " << b << endl;
}
};
class C : public B1, public B2 {
public:
int c = 0;
void print4() {
cout << "c = " << c << endl;
}
};
int main() {
C c1;
c1.print4();
c1.print1(); //错误, 产生二义性
system("pause");
}
上述代码在C++编译器中会产生二义性。
虚继承 (添加 virtual关键字)
解决方式是虚继承, 即在b1类继承b类与b2类继承b类上分别添加virtual关键字,
#include<iostream>
using namespace std;
class B {
public:
int b=3;
void print1() {
cout << "b = " << b << endl;
}
};
class B1 : virtual public B {
public:
int b1=1;
void print2() {
cout << "b = " << b << endl;
}
};
class B2 : virtual public B {
public:
int b2=1;
void print3() {
cout << "b = " << b << endl;
}
};
class C : public B1, public B2 {
public:
int c = 0;
void print4() {
cout << "c = " << c << endl;
}
};
int main() {
C c1;
c1.print4();
c1.print1();
system("pause");
}