我有一个带有模板的类,一些类继承自他。 我们想在不声明其模板类型的情况下创建父类的实例,并调用一个返回模板类型的函数。
例子:
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/