C++ 使用派生类的类型重写函数参数类型
我计划用一个接受自己类型参数的方法创建一个接口(而不是c++中的虚拟基类)C++ 使用派生类的类型重写函数参数类型,c++,C++,我计划用一个接受自己类型参数的方法创建一个接口(而不是c++中的虚拟基类) class Base { public: virtual void seriousMethod(const Base &arg) = 0; } 但是,派生类不应采用基类类型的参数,而应采用派生类类型的参数 class Derived: public Base { public: virtual void seriousMethod(const Derived &arg) { /* ...
class Base {
public:
virtual void seriousMethod(const Base &arg) = 0;
}
但是,派生类不应采用基类类型的参数,而应采用派生类类型的参数
class Derived: public Base {
public:
virtual void seriousMethod(const Derived &arg) { /* ... */ }
}
我怎么会意识到这一点?我是否必须对基类(例如,
base
)进行模板化,或者是否有更干净的解决方案?您不能直接这样做。想想这个例子:
Base b;
Derived d;
Base& d_ref = d;
d_ref.seriousMethod(b); // What happens here?
在编译时,变量d_ref
具有静态类型Base
,因此根据Base
的定义,它应该能够将b
作为seriousMethod
的参数
但是在运行时,d\u ref
的动态类型是派生的
,因此根据派生的
的定义,它不能将b
作为系列方法
的参数。它不能将b
转换为Dervied
,因为它可能是一个直接的Base
对象(如果Base
不是抽象的),或者它可能是从Base
派生的其他类,与derived
不同
您正确地认为,实现这一点的唯一真正方法是奇怪的重复模板模式,即模板化Base
并将Dervied
定义为:
class Derived : public Base<Derived> { ... }
派生类:公共基{…}
这就消除了上面说明的问题,因为从
Base
派生的每个类型都有一个不同的基类,并且不会通过继承相互关联。更重要的是,这样做的动机是什么?“然而,派生类不应采用基类类型的参数,而应采用派生类类型的参数”--那么,拥有虚拟方法有什么意义?@EdHeal具体来说,是一个由派生实现指定的A-Star搜索通用节点类。@AdamS-什么是A-Star搜索?