首页 > 解决方案 > 具有不同模板类型的子类的多态性

问题描述

我有带模板的类,有些类继承自他。我们想创建父类的实例而不声明其模板类型,并调用返回模板类型的函数。

例子:

class FatherWrap {
    virtual ~FatherWrap() = default;
};

template<typename T>
class FatherClass : public FatherWrap
{
    virtual T getValue();
};

class SonClass1 : public FatherClass<int>
{
    int getValue() override;
};

class SonClass2 : public FatherClass<string>
{
    string getValue() override;
};  

int main()
{
    FatherWrap* ch = new SonClass1();
    T a = ch->getValue; // What to do instead of T.
}

标签: c++classtemplatespolymorphismabstract-class

解决方案


假设您有:

  • 未参数化(无模板)的基类B
  • I<T>继承自的中间模板类B
  • 一些派生类D1,D2等,它们中的每一个都继承自I

您想根据B. 你可以这样做——但你必须限制自己使用B定义的 API。的方法B可以是虚拟的,并且这些方法的实现/覆盖I<T>可以Dx使用 type T,但这些类型不能暴露给只知道的组件B

如果您想编写一些使用 的逻辑T,那么该逻辑需要在 的方法中I<T>,或者在本身使用类类型参数化的模板函数中:

template<class U>
U someTypeSpecificLogic(I<U> intermediate) {
    // can call methods that accept/return U here
}

您不能根据类型编写逻辑,B因为T该类型仅针对子类定义I<T>。考虑到B你是一个不同的子类,B而不是一个I<T>


推荐阅读