为什么二级继承之后需要限定名?
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
私下继承自 A
,C
无法访问 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;
};
我 运行 遇到了一个问题,我设法解决了这个问题,但仍然想了解语言及其背后的原因。我有以下三个系统 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
私下继承自 A
,C
无法访问 A
的内容,其中包括 A
的注入-class-名字.
Also is the override of the
do_something()
method guaranteed to work this way, or is qualifying the typeA
in theB
'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;
};