c++ - 不允许从 C++ 中的某些类继承

标签 c++ templates inheritance

<分区>

我在 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是用来声明一个方法或类,可以访问该类的私有(private)字段和方法,但是friend T是什么意思?

它基于以下页面:

enter image description here

最佳答案

虚拟继承的类总是成为最派生类的直接父类(super class)。换句话说,任何继承自 Bar 的东西将直接继承自Foo<Bar> .这就是虚拟继承的意思。

然而,Foo<Bar>有一个私有(private)构造函数,并且只有 Bar是类(class)的friend ,因此只有 Bar可以继承自Foo<Bar> .

这有效地阻止了声明 Baz 的子类,因为那个子类实际上必须继承模板类,但它不能构造它,因为继承的构造函数是私有(private)的。

关于c++ - 不允许从 C++ 中的某些类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894515/

相关文章:

c++ - 在 C++ 元编程中是否全部使用模板?

c++ - 检测私有(private)成员的存在

c - 是否有可能从抽象/基本结构继承或在 C 中沿着这些线路模拟某些东西?

c++ - 将当前日期精确到毫秒

c++ - 我自己的操作系统内核上的 C++ 静态构造函数

c++ - 重载模板函数时显式特化和常规函数之间的区别

php - 如何从类外部调用父方法?

c++ - C++中类名的访问修饰符

c++ - 如何轻松使 std::cout 线程安全?

c++ - while 循环、字符串和整数