我将以下称为“多重再继承”:
- 直接继承一个类一次,通过继承其一个或多个后代间接继承一次或多次
- 通过继承一个类的两个或多个后代来间接继承一个类两次或多次
我想知道它是否存在以及如何明确地访问嵌入的子对象。
1.) [ Professional C++,第 2版] †</ sup > 声明可编译程序不能有一个类直接继承其直接父类和所述父类的父类。这是真的吗?
给定一个扩展的GrandParent
and ,VC12 和 g++ 允许 a直接继承自两个and 。在 VC12 和 g++ 中,可以按如下方式定义这些类:Parent
GrandParent
GrandChild
Parent
GrandParent
GrandParent
声明一个int num
数据成员。除了继承's之外,还Parent
声明了自己的. 除了继承's 和's之外,还声明了自己的。num
GrandParent
num
GrandChild
num
Parent
GrandParent
num
VC12 似乎允许全面明确的成员访问,但 g++ 仅在某些情况下允许它。
#include <iostream>
using std::cout;
using std::endl;
struct GrandParent { int num; };
struct Parent : GrandParent { int num; };
struct GrandChild : GrandParent, Parent { int num; };
int main()
{
GrandChild gc;
gc.num = 2;
gc.Parent::num = 1;
gc.Parent::GrandParent::num = 0; // g++ error: ‘GrandParent’ is an ambiguous base of ‘GrandChild’
gc.GrandParent::num = 5; // g++ error: ‘GrandParent’ is an ambiguous base of ‘GrandChild’
// --VC12 output; g++ output--
cout << gc.num << endl; // 2 ; 2
cout << gc.Parent::num << endl; // 1 ; 1
cout << gc.Parent::GrandParent::num << endl; // 0 ; N/A due to above error
cout << gc.GrandParent::num << endl; // 5 ; N/A due to above error
}
2.) 为什么 (a)gc.Parent::GrandParent::num
在 g++ 中是模棱两可的,而 (b)gc.Parent::num
不是?(a) 唯一地描述了它在继承树上的位置。gc
只有 1Parent
个子对象,它只有 1GrandParent
个子对象,它只有 1 个num
。对于 (b),gc
有一个Parent
,它有自己的num
,但也GrandParent
有另一个的子对象num
。
3.) 对于gc.GrandParent::num
,似乎 VC12gc
为GrandParent
后者的num
. 我猜它是明确的原因是它是一个由 限定的名称查找,因此在 ' 范围内首先查找gc
右侧的实体,并且最直接到' 的范围是直接继承的,而不是通过间接继承一个。我错了吗?.
gc
GrandParent
gc
Parent
4.) 为什么gc.GrandParent::num
对 g++ 不明确 gc.Parent::num
?如果一个是模棱两可的,那么两者不应该同样模棱两可吗?对于先验,gc
有两个GrandParent
s;对于后者,Parent
有 2num
秒。
†</sup>Gregoire, Marc R. 等人。专业 C++,第 2版。印第安纳波利斯:威利出版社,2011 年。241. 打印。