使用派生类的类型重写函数参数类型
Override function parameter type with type of derived class
我计划创建一个接口(而不是 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>
派生的每个类型都有一个不同的基类,并且不会通过继承相互关联。
相关文章:
- 在 C++ 中用派生类型重写成员函数
- 具有引用返回类型的重写方法上的协变返回类型无效
- 继承类中的 C++ 成员变量类型重写
- 重写代码 c++ 时未解析的重载函数类型
- 通过替换类型重写参数包
- 为什么重写方法并将 const 添加到参数类型有效
- 重写运算符的返回类型=
- C++重写 void 函数返回类型会导致生成失败
- 重写虚函数协变返回类型(两个指针)
- 重写基类返回类型
- 如何自动更新重写方法的 *this 返回类型
- 在 c++ 中具有不同返回类型的重写方法
- 在C++中重写类型定义
- 重写返回基类型的函数
- 重写虚拟函数返回类型不同,并且不是协变的
- 如何重写基类成员的类型
- 重写基元数据类型的转换
- 使用派生类的类型重写函数参数类型
- C++动态类型重写方法
- 如何使用泛型返回类型重写虚拟函数