我无法重写基类的方法,因为我的派生类是模板化的
I can't override Base class's method because my derived class is templatised
我尝试覆盖基类函数,但由于我已经模板化了它的子/派生/子类,所以我无法覆盖该函数,具体取决于我实例化模板的类型。
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 并让它从更高的父级(不是模板化的(继承,但我遇到了同样的问题。
有什么办法吗?
如果返回值T
与纯虚函数的返回值协变,则可以执行此操作。但遗憾的是,T
通常不会与double
共变。
接受你混合了静态和动态多态技术,这可能是一个设计缺陷,你可以定义
struct Cov {};
跟
struct BaseType
{
virtual Cov& getPropertyValue() = 0;
};
然后
template <typename T>
struct NumberType : BaseType
{
T propertyValue;
T& getPropertyValue() override { return propertyValue; }
};
其中T
是Cov
的子类:这种关系意味着T&
是与Cov&
协变的返回类型,因此编译将成功。 这样做还可以避免T
的价值副本被占用。您可能还会发现为最终构建具有基元类型返回值的各种T
构建转换运算符很方便。
您还可以引入const
引用返回类型以满足确切的要求。
BaseType
有一个对其所有后代具有约束力的协定。它说getPropertyValue
返回double
.NumberType
无法修改合同,但它是一成不变的。
让我们假设合同不存在。
BaseType& base = BaseContainer.getSome();
// base can be NumberType<complex> or
// or NumberType<tensor<double,4,4,4>> or NumberType<padic<5>>
// or a type that is not even thought of yet
// as of now.
what = base.getPropertyValue(); // how should 'what' be declared?
如果我们不知道base.getPropertyValue()
的结果是什么,就没有办法使用它。
使返回类型协变并没有真正的帮助。它只是将问题从BaseType
转移到BaseType::getPropertyValue()
返回的任何基类。
您需要提出一个可用的BaseType
接口,并在所有后代类中坚持使用它。
相关文章:
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 获取我的基类以递增派生类对象整数
- 我无法重写基类的方法,因为我的派生类是模板化的
- 我可以将虚函数中的这个指针视为派生类的这个指针吗?
- 我如何确保从我的派生类中调用纯虚拟方法
- 从我的driver.cpp调用派生类
- 我该如何称呼仅派生类的破坏者
- 为什么当我抛出派生类的对象时,基类的 catch 块会捕获异常
- 为什么我的派生类构造函数被删除了?
- 为什么不能从初始值设定项列表初始化我的类,即使它派生自 std::list?
- 为什么我的基类指针变量不能访问派生类中的函数?
- 为什么我的派生类(股票)给出错误
- 无法让 QColumnView 使用我的 QAbstractItemModel 派生类显示多行数据
- 我需要制作一个包含基类和派生类的对象的向量,并知道哪个元素是哪个元素
- 在这种情况下,我的派生类是否还需要一个虚拟析构函数
- 为什么我的派生类构造函数不起作用
- 将派生类对象分配给基类对象时会发生什么(我的意思是对象断言,而不是指针)
- 当我的基类和派生类具有相同的函数时,它必须是虚拟的吗?
- 为什么我的 CStatic 派生类没有接收 OnMouseLeave 事件,但可以接收 OnMouseMove
- 为什么我的派生类是抽象类?C++