我正在使用私有继承,我惊讶地发现在派生类中不允许使用任何基对象。
class A;
class B : private A;
class C : public B;
C::method_1()
{
A* a; // Temporary "A" object for local computation
}
这与继承无关。我不想访问任何this->base method
!
此配置在Visual Studio中提供了一个私有错误(“'A‘不可访问,因为'B’使用‘C2247’继承自'A‘")。
发布于 2017-11-28 17:35:31
更改此设置:
A* a;
要这样做:
::A* a;
由于C
继承自B
,B
继承自A
,因此您需要使用作用域解析操作符来完成此任务。
由于::
,::A
开始关注全局作用域,而不是从包含类parents的局部作用域开始。
11.1.5访问说明符
在派生类中,查找基类名称将在声明它的作用域中找到注入的类名,而不是基类的名称。injected- class -name可能比声明它的作用域中的基类名称更难访问。
发布于 2017-11-28 17:55:39
ISO C++:11.1访问说明符
5注意:在派生类中,基类名称的查找将注入fi- class - name,而不是声明它的作用域中基类的名称。注入的类名可能比声明它的作用域中的基类的名称更难访问。-end笔记
下面是标准中的示例:
class A { };
class B : private A { };
class C : public B {
A* p; // error: injected-class-name A is inaccessible
::A* q; // OK
};
https://stackoverflow.com/questions/47528075
复制相似问题