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

No use of base object allowed in private inheritance

本文关键字:对象 继承 不允许      更新时间:2023-10-16

我正在使用私有继承,我很惊讶地看到在派生类中不允许使用任何对象。

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 中提供了 C2247 错误("'A'不可访问,因为'B'使用'私有'从'A'继承")。

更改以下内容:

A* a;

对此:

::A* a;

由于C继承自B,而B继承自A,因此您需要范围解析运算符来完成这个技巧。

::A不是从包括类家长的本地范围开始,而是因为::而开始查看全局范围。

从标准:

11.1.5 说明符

在派生类中,基类名称的查找将找到 注入类名,而不是作用域中基类的名称 其中宣布了它。注入的类名可能更少 可访问的比基类在其作用域中的名称 被宣布。

ISO C++: 11.1 访问说明符

5 [注意:在派生类中,基类名称的查找将查找注入的类名,而不是声明基类的作用域中基类的名称。注入的类名可能比声明它的范围内的基类名称更难访问。—尾注]

以及标准中的示例:

class A { };
class B : private A { };
class C : public B {
A* p; // error: injected-class-name A is inaccessible
::A* q; // OK 
};

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