为什么二级继承之后需要限定名?

Why is a qualified name required after the second level of inheritance?

我 运行 遇到了一个问题,我设法解决了这个问题,但仍然想了解语言及其背后的原因。我有以下三个系统 classes:

文件class_a.hpp

#pragma once

class A
{
public:
    A();
};

文件class_b.hpp

#pragma once

#include "class_a.hpp"

class B : A
{
public:
    B() : A() {}

    virtual double do_something(A &with_object) const;
};

文件class_c.hpp

#pragma once

#include "class_b.hpp"

class C : B
{
public:
    C() : B() {}

    double do_something(::A &with_object) const; // but differently than class B
};

现在,如果我 不是 在 C 的 do_something() 方法中使用类型 A 的完全限定名称,我会得到以下结果编辑器中仍有错误:

type "A::A" (declared at line 27 of "class_a.hpp") is inaccessible C/C++(265)

在这种情况下,有什么可能导致歧义?我当然没有重新定义或使用名称 A 作为标识符。是否在后台发生了使用 class 名称的事情?

do_something() 方法 gua运行 的覆盖是否也需要以这种方式工作,或者是否也需要在 B 的方法中限定类型 A

任何建议and/or 指点也非常感谢!

在继承的其他事物中,有injected-class-names。您可以将它们视为隐藏类型别名:class A 中有类似 using A = A; 的东西,指向它自己。

请记住 class 继承默认为 private

由于 B 私下继承自 AC 无法访问 A 的内容,其中包括 A 的注入-class-名字.

Also is the override of the do_something() method guaranteed to work this way, or is qualifying the type A in the B's method also required?

是的,B 中的覆盖有效。由于 B 直接继承自 A ,它可以访问其所有内容,无论继承是否私有。


您的代码类似于以下内容。我用一个实际的类型别名替换了 injected-class-name,并得到了相同的行为。

class A
{
  public:
    using A_type = A;
};

class B : A
{
  public:
    virtual double do_something(A_type &with_object) const;
};

class C : B
{
  public:
    double do_something(A_type &with_object) const;
};