洛基C++;:如何';分散层次标签';解决继承歧义? 我将通过Alexandrescu的现代C++设计第3章。它解释了的实现,但此后对库进行了更改

洛基C++;:如何';分散层次标签';解决继承歧义? 我将通过Alexandrescu的现代C++设计第3章。它解释了的实现,但此后对库进行了更改,c++,loki,C++,Loki,我无法理解ScatterHierarchyTag如何解决解析字段函数中的歧义(该函数允许我们访问特定基定义的成员,例如字段(对象)将使我们获得一个基到对象),用于生成层次结构的类型列表具有重复项时。(例如:GenScatterHierarchy对象)我看到它在每个分支中都添加了一个唯一的“type/tag”,就在根Base类之前,但仍然存在歧义,对吗 先谢谢你 编辑: 显示类型列表中重复类型的多重继承问题的图表。 GSH=GenScatterdHierarchy 我相信对于Base(用蓝线标记

我无法理解
ScatterHierarchyTag
如何解决解析
字段
函数中的歧义(该函数允许我们访问特定
定义的成员,例如
字段(对象)
将使我们获得一个
对象
),用于生成层次结构的类型列表具有重复项时。(例如:
GenScatterHierarchy对象
)我看到它在每个分支中都添加了一个唯一的“type/tag”,就在根
Base
类之前,但仍然存在歧义,对吗

先谢谢你

编辑:

显示类型列表中重复类型的多重继承问题的图表。 GSH=GenScatterdHierarchy

我相信对于
Base
(用蓝线标记一个)的两个连接中的每一个,都会分别插入唯一的标记(根上的其他基类也是如此)


此外,我还插入了图片,以便于大家理解。如果它不符合stackoverflow的指南,请告诉我,我将删除它。

ScatterHierarchyTag
并没有消除歧义。它所做的是使一个模棱两可的基类可访问

考虑以下类层次结构:

class A {};
class B : public A {};
class C : public A, public B {};
C
包含类
A
的两个副本(当A不为空时更有意义:),一个是由于直接继承而创建的,另一个是由于通过
B
间接继承而创建的。您可以访问转换为
B
第一个的第二个实例:

A &indirect_base = static_cast<B>(C_instance);
A&indirect\u base=static\u cast(C\u实例);

另一个例子是,根本没有办法访问它。因此,它被称为“无法接近的基地”

此示例自然嵌入由
GenScatterHierarchy
创建的类层次结构中:

  • GenScatterHierarchy
    A
  • GenScatterHierarchy
    B
  • GenScatterHierarchy(TYPELIST_4(int,int,string,Widget))
    C

  • 因此,为类型列表中的第一个
    int
    创建的
    Base
    实例是一个不可访问的基。但是,如果添加了
    ScatterHierarchyTag
    ,我们可以通过强制转换到
    GenScatterHierarchy
    来访问它。

    “对于另一个实例,根本无法访问它。因此,它被称为“不可访问的基”。“另一个实例意味着直接继承
    A
    得到的
    C
    ?”?是否仍然无法通过
    A&direct\u base=C\u实例访问它@User10482,完全正确
    A&direct\u base=C\u实例
    不起作用,因为它不明确。非常有趣!非常感谢。我几乎放弃了得到这个问题的好答案@米扎布里克