c++ - 具有不同模板类型的子类的多态性

标签 c++ class templates polymorphism abstract-class

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

例子:

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.
}

最佳答案

假设您有:

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

您想根据 B 编写一些代码.你可以这样做——但你必须限制自己使用 API B定义。 B的方法可以是虚拟的,并且这些方法的实现/覆盖在 I<T> 中和 Dx可以使用类型 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>根本。

关于c++ - 具有不同模板类型的子类的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54516086/

相关文章:

c++ - 如何在编译时选择正确的重载函数模板?

c++ - iPhone 4(S) 上的 OpenCV cvtColor() 性能问题

python - 构建类以迭代返回的结构

ios - 为什么 didReceiveData 函数不起作用

c++ - 通用模板非类型参数

c++ - 模板类的成员函数模板与模板类的成员函数的区别

c++ - 在堆对象的上下文中理解堆栈

c++ - QueryPerformanceCounter 限制/加快滑动速度

c++ - 空类的单继承层次结构是否保证 sizeof 相等?

c++ - 为什么相同的模板类会得到相同的静态 ID?