【问题标题】:Not allowing to inherit from some class in C++ [closed]不允许从 C++ 中的某个类继承 [关闭]
【发布时间】: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是什么意思呢?

它基于以下页面:

【问题讨论】:

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

标签: c++ templates inheritance


【解决方案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 基址中的那个。虚拟继承意味着 多个 相同类型的虚拟基合并为一个子对象,该子对象由具有该虚拟基的所有基子对象共享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
相关资源
最近更新 更多