不允许从 C++ 中的某个类继承 [关闭]

Posted

技术标签:

【中文标题】不允许从 C++ 中的某个类继承 [关闭]【英文标题】:Not allowing to inherit from some class in C++ [closed] 【发布时间】:2019-07-04 21:51:19 【问题描述】:

我在C++ 中遇到了以下程序:

template <class T>
class Foo 
    Foo() ;
    friend T;
;
class Bar : public virtual Foo<Bar> 
     void doPrivateStuff();
public:
     template<typename T>
     void baz(T a)  cout << a << endl; 
;

它说使用这种方式不可能从Bar继承。我有两个问题:

是什么让编译器不允许从Bar 继承? 我可以虚拟继承吗? 我知道friend是用来声明可以访问类的私有字段和方法的方法或者类,但是friend T是什么意思呢?

它基于以下页面:

【问题讨论】:

你能告诉我们编译器的信息吗? I can inherit from Bar just fine @AndyG -- 现在尝试在main() 中实例化“Baz baz;”,看看会发生什么。 @AndyG 尝试声明一个构造函数。我猜是因为bar 是一个模板类,在使用之前它不会初始化它,这就是你的示例编译的原因。 【参考方案1】:

虚拟继承的类总是成为最派生类的直接超类。换句话说,任何从Bar 继承的东西都将直接Foo&lt;Bar&gt; 继承。这就是虚拟继承的含义。

但是,Foo&lt;Bar&gt; 有一个私有构造函数,并且只有Bar 是类的friend,因此只有Bar 可以从Foo&lt;Bar&gt; 继承。

这有效地阻止了声明Baz 的子类,因为该子类必须虚拟继承模板类,但它不能构造它,因为继承的构造函数是私有的。

【讨论】:

谢谢。是否可以添加如何通过 C++ 模板专业化功能传递它? 虚拟基类不会自动成为最派生类的直接基类。最派生的类将构造它,但除此之外,它在类层次结构中仍有其正常位置。 struct B int i; ; struct C : virtual B int i; ; struct D : C ; D d; d.i = 3; 该赋值分配给C 基址中的i,而不是B 基址中的那个。虚拟继承意味着 多个 相同类型的虚拟基合并为一个子对象,该子对象由具有该虚拟基的所有基子对象共享。

以上是关于不允许从 C++ 中的某个类继承 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++从入门到入土第十七篇:继承

C++继承

final 关键字!限定某个类或者方法不允许被继承或者修改

有没有办法限制继承? [关闭]

C#中继承问题

C++ VS代码爆红:不允许对不可访问的基类进行转换(子类继承父类时必须加上继承属性,比如public)