不允许在私有继承中使用基对象
No use of base object allowed in private inheritance
我正在使用私有继承,我很惊讶地看到在派生类中不允许使用任何基对象。
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++标准
相关文章:
- 如何创建从同一类继承的不同对象的向量
- 如何在QT Creator上将QWidget声明为继承类的对象
- 如果'C'公开继承'B',B 私下继承'A',为什么我不能在"C"中创建"A"的对象?
- 私有字段对象与私有继承?
- 为什么我不能在主函数之外定义一个类的对象(它继承了另一个类)?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 使用智能指针附加的继承对象的深层复制
- 如何继承返回对当前对象的引用的方法?
- C++具有空派生类对象的继承大小
- 防止在按值传递对象(继承)时进行切片
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 对象成员变量还是继承
- 继承 - 查找类的对象的大小
- 成员子对象继承存储持续时间是否有任何非直观的副作用
- 访问从 QObject 继承的对象继承的类的Q_Properties
- c++如何返回当前类类型的对象(继承)
- 在对象继承中构造对象后设置稍后的值
- c++ -从其他对象继承std::元组,并为其添加虚函数
- 我有一个基对象和派生类对象的向量,但我无法访问存储在向量中的派生对象继承的数据成员
- 从基础对象继承接口是一种好的做法吗