class A
{
//friend class B;
protected:
A(){cout << "A\n";};
};
class B: virtual A
{};
class C : B
{};
int main() {
C c;
return 0;
}
我能够成功编译此代码,但由于A:A()受到保护,我期待错误。 基于以下事实:对于虚拟基类,其最派生类直接将其称为基类。 上面的代码给出了在基类中私有访问ctor()的编译错误[expected]。 有人可以澄清一下,谢谢!
答案 0 :(得分:3)
拥有protected
访问说明符意味着派生类可以访问该实体。 C
也来自A
,它不必直接从中派生,以便有资格获得受保护的访问权。
另一方面,private
访问权限会阻止任何派生类具有B
和 C
的可访问性。
无法以一种只允许直接派生的类来访问构造函数(特别是一组直接派生类)的方式来控制访问。您可以做的最多的事情是使用private
访问权限和friend
附带一组封闭的派生类。
解决您对问题的评论:
我想禁止从B
继承
将B
标记为最终
class B final : A
{};