我有这个继承问题我无法解决这个问题。我有三个班,他们之间有父母关系。它们都具有函数 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**'
答案 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
};
现在,您可以修改环境并要求环境中的所有对象计算其力。无论他们是小船,帆船还是海豚。