【问题标题】:Override function parameter type with type of derived class用派生类的类型覆盖函数参数类型
【发布时间】:2013-09-11 08:07:04
【问题描述】:

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

class Base {
public:
    virtual void seriousMethod(const Base &arg) = 0;
}

然而,派生类不应接受基类类型的参数,而是派生类类型的参数。

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

我怎么会意识到这一点?我是否必须对基类进行模板化(例如Base<Derived>)还是有更清洁的解决方案?

【问题讨论】:

  • 更重要的是 - 这样做的动机是什么?
  • “派生类不应该接受基类类型的参数,而是派生类类型的参数”——那么拥有虚拟方法有什么意义呢?
  • @EdHeal 具体来说,是由派生实现指定的 A-Star 搜索通用节点类。
  • @AdamS - 什么是 A-Star 搜索?

标签: c++


【解决方案1】:

您不能直接执行此操作。想想这个案例:

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&lt;T&gt; 派生的每个类型都有一个不同的基类,并且不会通过继承相互关联。

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2019-08-17
    相关资源
    最近更新 更多