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

时间:2017-10-16 12:32:30

标签: c++ inheritance virtual-functions

我有这个继承问题我无法解决这个问题。我有三个班,他们之间有父母关系。它们都具有函数 calcForces()

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


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


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

现在我的问题是II有一个对象被创建为 Sailboat (并将其保存在Object-pointer中),但是当我调用 calcForces()时我结束了在 Boat :: calcForces()里面,而不是 Sailboat :: calcForces()。我究竟做错了什么?

这是我对函数的调用:

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

3 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:2)

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

因此,当您在没有参数的情况下调用calcForces时,它将以继承的方法结束。要解决此问题,请将其添加到Sailboat中,如上所述,或使用Wind

类型的变量调用它

答案 2 :(得分:2)

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

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
};

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