c++ - 模板类有两种类型,继承和前向声明

标签 c++ templates inheritance

我正在思考这个问题。我认为这实际上是不可能的,但只是为了确定我想在这里询问是否确实有解决方案。 考虑以下代码。有 2 个模板类 A 和 B 以及两个非模板类 C 和 D,它们分别派生自 A 和 B。

// definition of class A
template <class DerivedA, class DerivedB> class A {
private:
    DerivedB data;
public:
    A(const DerivedB& data) : data(data) {}
    virtual ~A() {}
    DerivedB get() const { return data; }
};

// definition of class B
template <class DerivedA, class DerivedB> class B {
private:
    DerivedA data;
public:
    B(const DerivedA& data) : data(data) {}
    virtual ~B() {}
    DerivedA get() const { return data; }
};

// forward declaration of D
class D;

// definition of class C, derives from A<C, D>
class C : public A<C, D> {
private:
    int extraInfo;
public:
    C(const D& d) : A(d) {}
    virtual ~C() {}
    int getExtraInfo() const { return extraInfo; }
};

// definition of class D, derives from B<C, D>
class D : public B<C, D> {
private:
    int extraInfo;
public:
    D(const C& c) : B(c) {}
    virtual ~D() {}
    int getExtraInfo() const { return extraInfo; }
};

这里的问题是类 C 无法定义,因为类 D 仅是前向声明的。因此,当模板 A 被写出时,它不知道其私有(private)成员的类型是什么。请注意,我无法使用指针,我需要一些已知的功能。是否可以通过任何方式进行编译,使我拥有 C 类和 D 类?

最佳答案

正如您所解释的那样,这个问题没有办法解决,也不应该有。正如你现在所拥有的:

class C : public A<C, D>

意味着C将继承D类型的数据成员。依次:

class D : public B<C, D>

意味着D将继承C类型的数据成员。

如果C有一个D,它有一个C,它有一个D...你有一个很好的无限递归,这意味着在这种情况下任何 CD 对象的大小都是无限的。

因此,除非您使用指针(您可以在任何点插入适当的空指针来切断无限链)或引用(您可以引用以前使用过的对象),否则您不能也不应该拥有这种类型。

关于c++ - 模板类有两种类型,继承和前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337233/

相关文章:

c++ - 给定类型为 Container<T>::Iterator 的函数参数,我如何实现特定类型 T 的特定重载?

c++ - 继承子类时默认的保护级别是多少?

c++ - C2664 将子类转换为模板父类时

c++ - 关于 C++ 中常量的隐式转换

c++ - pragmas simd 和 ivdep vector 之间的区别总是?

c++ - 枚举器运算符重载 C++ 中的 '&' token 之前的预期初始值设定项

c++ - 释放指针意味着我不能将指针用作 *p?

c++ - 动态迭代静态信息

c++ - std::forward 编译错误 VS2010

c# - 是否应该使用自引用通用继承,如 Customer : Entity<Customer>