2017-10-16 31 views
-1

继承问题我只是无法环绕我的头。我有三个班级,他们之间有父母关系。它们都具有功能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**' 
+2

请显示[MCVE]。 –

+2

您需要通过指针调用多态行为。尝试:'this-> object_ptr_arr [i] - > calcForces();' – Galik

+4

为了避免这些问题,请参阅http://en.cppreference.com/w/cpp/language/override – stefaanv

回答

11

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

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

+0

非常好的捕获:) – fjardon

+0

我会提到'override'关键字,它的作用是在编译时检查它并避免错误。 – skypjack

+0

@skypjack完成! – acraig5075

2

如果你想在你的帆船calcForces()方法,你应该在那里添加它。 目前你只需要在你的帆船calcForces(Wind wind)方法(和从Boat继承了calcForces()

所以,当你不带参数调用calcForces它将在继承的方法结束。要解决此问题,请将其添加到Sailboat(如上所述)或使用类型变量调用它Wind

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

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

+0

非常好的建议,并且因为面向对象的方法而绝对可取。但是,如果他将来面临类似的问题,那么这不是很有用,因为它没有描述他做错了什么。 – Rafiwui