继承:子代使用父虚函数而不是自己
继承问题我只是无法环绕我的头。我有三个班级,他们之间有父母关系。它们都具有功能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作为帆船创建了一个对象(和对象指针保存它),但是当我打电话calcForces()我结束了内部船:: calcForces(),而不是Sailboat :: calcForces()。我究竟做错了什么?
下面是我调用该函数:
(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**'
的覆盖的声明必须匹配。您的Sailboat::calcForces
声明采用不同的参数(一个Wind
实例),因此不是覆盖。
作为@stefaanv和@skypjack的评论,您可以通过使用override
函数说明符来避免此问题,该函数说明符在编译时会捕获错误。
非常好的捕获:) – fjardon
我会提到'override'关键字,它的作用是在编译时检查它并避免错误。 – skypjack
@skypjack完成! – acraig5075
如果你想在你的帆船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
};
现在您可以修改环境并要求环境中的所有对象计算其力量。无论他们是船只,帆船还是海豚。
非常好的建议,并且因为面向对象的方法而绝对可取。但是,如果他将来面临类似的问题,那么这不是很有用,因为它没有描述他做错了什么。 – Rafiwui
请显示[MCVE]。 –
您需要通过指针调用多态行为。尝试:'this-> object_ptr_arr [i] - > calcForces();' – Galik
为了避免这些问题,请参阅http://en.cppreference.com/w/cpp/language/override – stefaanv