通过使用范围解析避免多重继承引起的歧义

时间:2017-10-09 12:43:15

标签: c++ c++11 inheritance multiple-inheritance diamond-problem

以下是多重继承的示例。我使用范围解析运算符来解决歧义,而不是虚拟类。

struct A 
{
    int i;
};

struct B : A
{};

struct C : A
{};

struct D: B, C 
{
    void f()
    {
        B::i = 10;
    }
    void g()
    {
        std::cout << B::i <<std::endl;
    }
};

int main() 
{
    D d1;
    d1.f();
    d1.g();
    return 0;
}

B::i格式正确吗?

1 个答案:

答案 0 :(得分:5)

  

B::i格式正确吗?

是的,确实如此。最相关的参考是[class.qual]/1

  

如果qualified-id的嵌套名称说明符指定了一个类,那么   在查找嵌套名称说明符后指定的名称   除下列案例外,该类的范围。 这个名字   应代表该类别或其中一个成员的一个或多个成员   基类

其中指定您可以将i命名为B的基础成员。之后只会检查可访问性,在您的情况下它是公开的。

[class.access.base]/5

  

...对成员的访问受到其中的类的影响   成员被命名。这个命名类是成员所在的类   查找并找到了名称...此时可以访问成员m   如果

,则在N类中命名时为R.      
      
  • 存在可在R处访问的N的基类B,并且当在B类中命名时,m可在R处访问。
  •