使用派生类的类型重写函数参数类型

Override function parameter type with type of derived class

本文关键字:类型 重写 参数 函数 派生      更新时间:2023-10-16

我计划创建一个接口(而不是 c++ 中的虚拟基类),其中包含一个接受自己类型的参数的方法。

class Base {
public:
    virtual void seriousMethod(const Base &arg) = 0;
}
但是,派生类不应采用基类类型的参数

,而应采用派生类类型的参数。

class Derived: public Base {
public:
    virtual void seriousMethod(const Derived &arg) { /* ... */ }
}

我将如何实现这一点?我是否必须模板化基类(例如 Base<Derived> )还是有更清洁的解决方案?

你不能直接这样做。想想这个案例:

Base b;
Derived d;
Base& d_ref = d;
d_ref.seriousMethod(b);  // What happens here?

在编译时,变量d_ref具有静态类型Base,所以根据Base的定义,它应该能够将b作为参数来seriousMethod

但是在运行时,d_ref的动态类型是Derived的,所以根据Derived的定义,不能把b作为参数来seriousMethod。它无法将b转换为Dervied,因为它可能是一个直接Base对象(如果Base不是抽象的),或者它可能是从Base派生的其他类

,与Derived不同。

您正确地假设,唯一真正的方法是奇怪的重复出现的模板模式,即模板化Base并将Dervied定义为:

class Derived : public Base<Derived> { ... }

这消除了上面说明的问题,因为从Base<T>派生的每个类型都有一个不同的基类,并且不会通过继承相互关联。