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

msc*_*msc 4 c++ inheritance multiple-inheritance diamond-problem c++11

这是多重继承的一个例子.我使用范围解析运算符来解决歧义而不是虚拟类.

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;
}
Run Code Online (Sandbox Code Playgroud)

结构B::i良好吗?

Sto*_*ica 5

结构B::i良好吗?

是的.最相关的参考是[class.qual]/1:

如果qualified-id的nested-name-specifier指定了一个类,则在该类的作用域中查找在嵌套名称说明符之后指定的名称,但下面列出的情况除外.该名称应代表该类或其基类之一的一个或多个成员.

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

[class.access.base]/5

...对成员的访问权限受成员命名的类的影响.这个命名类是查找和找到成员名称的类...当在类N中命名时,成员m可以在R点访问

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