禁止使用多继承的场景 : 在 C++ 语言 环境 中 , 多继承 若干完整的 有成员函数 和 成员变量 的 类 , 是不推荐的做法 , 实际开发中 , 绝对禁止 使用 上述类型的 多继承 ;
多继承会带来一系列的问题 , 诸如 :
使用 虚继承 解决二义性问题 ;
在 菱形继承结构 中 , 虚继承可以使 重复继承 的 父类 , 只继承 依次 ;
多继承的二义性 参考 【C++】继承 ⑫ ( 继承的二义性 | virtual 虚继承 ) 博客 ;
在下面的 菱形继承结构 中 , D 继承 B 和 C 类 ,
但是 B 和 C 有共同的 父类 A ,
假如 访问 D 对象 中 继承自 A 类的成员 , 会产生二义性 ;
代码示例 :
#include "iostream"
using namespace std;
class A {
public:
int x;
};
// 子类 B 继承了父类 A 的 x 成员
class B : public A {
public:
int y;
};
// 子类 C 继承了父类 A 的 x 成员
class C : public A {
public:
int z;
};
// D 多继承 B 和 C
// 分别从 B 和 C 各自继承一个来自 A 的成员 x
class D : public B, public C {
public:
int k;
};
int main() {
// 定义 D 类对象 d
D d;
// 访问 继承自 A 类的 x 成员出现二义性
// 报错 error C2385: 对“x”的访问不明确
d.x = 40;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(35,6): error C2385: 对“x”的访问不明确
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(35,6): message : 可能是“x”(位于基“A”中)
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(35,6): message : 也可能是“x”(位于基“A”中)
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
在下面的 菱形继承结构 中 , D 继承 B 和 C 类 ,
但是 B 和 C 有共同的 父类 A , 这里 B 和 C 使用 虚继承 , 继承 A 类 ;
假如 访问 D 对象 中 继承自 A 类的成员 , 不会产生二义性 ;
代码示例 :
#include "iostream"
using namespace std;
class A {
public:
int x;
};
// 子类 B 继承了父类 A 的 x 成员
class B : virtual public A {
public:
int y;
};
// 子类 C 继承了父类 A 的 x 成员
class C : virtual public A {
public:
int z;
};
// D 多继承 B 和 C
// 分别从 B 和 C 各自继承一个来自 A 的成员 x
class D : public B, public C {
public:
int k;
};
int main() {
// 定义 D 类对象 d
D d;
// 访问 继承自 A 类的 x 成员不会出现二义性
d.x = 40;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :