我想这样做只有一个类Der
可以继承Base
类。所以我将Base
的构造函数设为私有,并将Der
添加为Base
的朋友:
struct Base {
template<class T>
friend struct Der;
private:
Base() = default;
};
template<class T>
struct Der : Base {};
这很有效。
然而,另一个结构DerDer
从Der
继承,多次使用不同的模板参数。
struct DerDer : Der<int>, Der<char> {};
这是一个问题,因为现在层次结构中有两个Base
,因此解决方案是让Der
实际上从Base
继承:
template<class T>
struct Der : virtual Base {};
现在打破了,我相信如果一个类实际上是继承的,那么最派生的类负责调用构造函数(不确定为什么)。这是一个问题,因为DerDer
不是Base的朋友,因此无法访问它的构造函数。
我该如何解决这个问题?
(看起来这是一个实现细节,虚拟继承使得派生类最多的类调用构造函数,因此友情应该尊重它是否正确这样做,这是编译器(或标准)中的一种错误)
答案 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
成员函数。