Gui*_*ine 18 c++ oop inheritance
我正在使用私有继承,我很惊讶地发现在派生类中不允许使用任何基础对象.
class A;
class B : private A;
class C : public B;
C::method_1()
{
A* a; // Temporary "A" object for local computation
}
Run Code Online (Sandbox Code Playgroud)
这与继承无关.我不想访问任何this->base method!
此配置在Visual Studio中提供C2247错误("'A'不可访问,因为'B'使用'private'继承'A'").
gsa*_*ras 23
改变这个:
A* a;
Run Code Online (Sandbox Code Playgroud)
对此:
::A* a;
Run Code Online (Sandbox Code Playgroud)
因为C从继承B,并B从A,所以你需要范围解析运营商做的伎俩.
而不是从包含类父类的本地范围开始,而是::A开始查看全局范围,因为::.
从标准:
11.1.5访问说明符
在派生类中,查找基类名称将查找inject-name-name,而不是声明它的作用域中基类的名称.inject-name的名称可能比声明它的作用域中的基类名称更不易访问.
Mih*_*ayl 15
ISO C++:11.1访问说明符
5 [注意:在派生类中,基类名称的查找将找到inject-name-name而不是声明它的作用域中基类的名称.inject-name的名称可能比声明它的作用域中的基类名称更不易访问. - 尾注]
以及标准的例子:
class A { };
class B : private A { };
class C : public B {
A* p; // error: injected-class-name A is inaccessible
::A* q; // OK
};
Run Code Online (Sandbox Code Playgroud)