私有继承中不允许使用基础对象

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,并BA,所以你需要范围解析运营商做的伎俩.

而不是从包含类父类的本地范围开始,而是::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)

N3797工作草案,编程语言C++标准