无法在C ++中成为虚拟继承的类的朋友

时间:2016-08-18 15:51:34

标签: c++ inheritance

我想这样做只有一个类Der可以继承Base类。所以我将Base的构造函数设为私有,并将Der添加为Base的朋友:

struct Base {
 template<class T>
 friend struct Der;
 private:
  Base() = default;
};

template<class T>
struct Der : Base {};

这很有效。

然而,另一个结构DerDerDer继承,多次使用不同的模板参数。

struct DerDer : Der<int>, Der<char> {};

这是一个问题,因为现在层次结构中有两个Base,因此解决方案是让Der实际上从Base继承:

template<class T>
struct Der : virtual Base {};

现在打破了,我相信如果一个类实际上是继承的,那么最派生的类负责调用构造函数(不确定为什么)。这是一个问题,因为DerDer不是Base的朋友,因此无法访问它的构造函数。

我该如何解决这个问题?

(看起来这是一个实现细节,虚拟继承使得派生类最多的类调用构造函数,因此友情应该尊重它是否正确这样做,这是编译器(或标准)中的一种错误)

2 个答案:

答案 0 :(得分:4)

一种选择是使用私有嵌套结构来控制构造struct Base { template<class T> friend struct Der; private: struct Permission {}; public: Base(Permission) {} virtual ~Base() = default; }; template <class T> struct Der : public virtual Base { protected: using Permission = Base::Permission; public: Der() : Base(Permission{}) {} }; struct DerDer : Der<int>, Der<char> { DerDer() : Base(Der<int>::Permission{}) {} }; 的权限。

Base

现在编写构造函数有点尴尬,但构造Der<T>的唯一方法是为T创建或继承strlen

答案 1 :(得分:0)

  

我该如何解决这个问题?

最简单的解决方案是使Base::Base()成为public成员函数。