带有混合继承修饰符(protected/private/public)的钻石继承
Diamond inheritance with mixed inheritance modifers (protected / private / public)
假设我们有class A,B,C,D
,其中A是基底,B,C介于两者之间,D是在钻石模型中导出的。
注意:
class B
在私有模式下虚拟继承class A
,
class C
在保护模式下继承了一个虚拟class A
。
class A
{
public:
int member; // note this member
};
class B :
virtual private A // note private
{
};
class C :
virtual protected A // note protected
{
};
class D :
public B, // doesn't metter public or whatever here
public C
{
};
int main()
{
D test;
test.member = 0; // WHAT IS member? protected or private member?
cin.ignore();
return 0;
}
现在,当我们制作class D
的实例时,成员将是什么?私人还是受保护的lol?
图2:
如果我们这样做怎么办:
class B :
virtual public A // note public this time!
{
};
class C :
virtual protected A // same as before
{
};
我想member
在第二个例子中是公开的,不是吗?
§11.6 Multiple access [class.paths]
如果一个名称可以由多个路径通过多重继承图访问,则访问权限是提供最多访问权限的路径的访问权限。示例:
class W { public: void f(); }; class A : private virtual W { }; class B : public virtual W { }; class C : public A, public B { void f() { W::f(); } // OK };
由于
W::f()
在通过B
的公共路径上可用于C::f()
,因此允许访问-结束示例]
我想我不需要添加任何其他内容,但也可以看到这个缺陷报告(它被关闭为"不是缺陷")。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 带有混合继承修饰符(protected/private/public)的钻石继承
- 为什么 C# 中不支持"public"或"private"或"protected"继承
- 我使用private继承了一个构造函数,为什么我仍然可以从主函数访问它
- private或public继承自boost::non_copyable