继承:Child 使用 parent 虚函数而不是它自己的

Inheritance: Child uses parent virtual function instead of its own

我在继承方面遇到了这个问题,我无法理解。我有三个 类,他们之间有亲子关系。它们都有函数 calcForces().

class Object {
public:
    virtual void calcForces();
};


class Boat : public Object {
public:
    virtual void calcForces();
};


class Sailboat : public Boat {
public:
    void calcForces(Wind wind);
};

现在我的问题是我创建了 object 作为 Sailboat(并将其保存在 Object-pointer 中),但是当我调用 calcForces() 我最终进入 Boat::calcForces(),而不是 Sailboat::calcForces() .我究竟做错了什么?

这是我对函数的调用:

(*this->object_ptr_arr[i]).calcForces();    //'object_ptr_arr' is of type 'Object**'

覆盖的声明必须匹配。您对 Sailboat::calcForces 的声明采用不同的参数(Wind 实例),因此不是覆盖。

正如@stefaanv 和@skypjack 所评论的,您可以通过使用 override 函数说明符来避免此问题,这会在编译时捕获错误。

如果您想在帆船中使用 calcForces() 方法,您应该将其添加到那里。 目前您的帆船中只有一个 calcForces(Wind wind) 方法(以及从 Boat 继承的 calcForces()

因此,当您在不带参数的情况下调用 calcForces 时,它将在继承的方法中结束。要解决这个问题,可以像上面描述的那样将它添加到 Sailboat 中,或者使用 Wind

类型的变量调用它

建议-小船和帆船存在于一个环境中。船知道它是如何受环境影响的。

class Environment
{
public:
  Wind wind;
};

class Object {
public:
    virtual void calcForces(Environment const&);
};


class Boat : public Object {
public:
    virtual void calcForces(Environment const& env); // can ignore the wind
};


class Sailboat : public Boat {
public:
    void calcForces(Environment const& env) override;  // will use env.wind in calculation
};

现在您可以修改环境并要求环境中的所有 objects 计算他们的力量。无论是小船、帆船还是海豚。