【发布时间】:2017-08-25 11:57:42
【问题描述】:
我尝试重写基类函数,但是因为我已经模板化了它的子类/派生类/子类,所以我不能根据实例化模板的类型来重写该函数。
struct BaseType
{
virtual double getPropertyValue() = 0;
};
template <typename T>
struct NumberType : BaseType
{
T propertyValue;
T getPropertyValue() override { return propertyValue; } // I would like this to return whatever T is.
};
int main()
{
std::vector<BaseType*> vectr;
NumberType<double> doubleType; // This is fine, overrides the base function
NumberType<int> intType; // Has no overrider, won't compile
}
所以我想也许我也可以模板化基类,以便基类函数也返回 T。但如果我这样做,我将无法将它们保存在容器中或指向它们,因为它们都属于不同的 Base 类型。
我还考虑过模板化 Base 并让它从更高的父级(未模板化)继承,但我遇到了同样的问题。
有没有办法解决这个问题?
【问题讨论】:
-
"我不能重写基类的方法,因为我的派生类是模板化的" 这不是你不能重写的原因。
-
对不起,我知道这听起来如何,你是对的。不仅仅是因为我已经将它模板化了,还因为我有依赖于模板参数的返回类型。
-
为什么你需要重写一个纯虚函数?在我看来,您正在混合静态和动态多态性。
-
为什么要将不同的类型放入同一个容器中?由于类型差异,您将无法正确使用它们。您实际上可以使用
template <class T> std::vector<NumberType<T>> numbers;来避免丢失类型信息。 -
我正在尝试抽象出不同的数据类型,这样我就可以拥有一个不同类型的容器,我认为他们称之为类型擦除?这是为了创建我自己的脚本,您可以在运行时动态创建自己的类,但看起来这是不可能的。
标签: c++ class inheritance polymorphism overriding