c++ - 具有不同模板类型的子类的多态性
问题描述
我有带模板的类,有些类继承自他。我们想创建父类的实例而不声明其模板类型,并调用返回模板类型的函数。
例子:
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
. 你可以这样做——但你必须限制自己使用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>
。
推荐阅读
- python - 如何在 pd.DatetimeIndex 中为缺少的月份返回 NaN
- php - 无法从 DB,Laravel 获取行
- django - Django,为什么我在托管期间需要 nginx 和 uWSGI?
- c - 通过UART发送数据期间的STM32 Timer Counter问题
- ruby-on-rails - Selenium::WebDriver::Error::UnknownError: Invalid Content-Type
- android - 更改正负按钮和间距的颜色
- spring - 为什么注入 bean 仍然需要更改代码?
- java - 请求被拒绝,因为没有找到多部分边界 java
- javascript - JavaScript, onload="setTimeout('autoClick();',1500);" 后删除点击
- docker - 如果 CMD 是 exec 形式,如何在 compose 文件中运行多个命令?