gpt4 book ai didi

c++ - 无法在 C++ 中与虚拟继承自它的类成为 friend

转载 作者:太空狗 更新时间:2023-10-29 20:54:28 26 4
gpt4 key购买 nike

我想让它只有一个类 Der 可以子类化 Base 类。所以我将 Base 的构造函数设为私有(private),并将 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 的友元,因此无法访问它的构造函数。

我该如何解决这个问题?

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

最佳答案

一种选择是使用私有(private)嵌套结构来控制构造 Base 的权限。 .

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 .

关于c++ - 无法在 C++ 中与虚拟继承自它的类成为 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39022600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com