Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用派生类的类型重写函数参数类型_C++ - Fatal编程技术网

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) { /* ...

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

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搜索?