C++ 继承:子函数使用父虚函数而不是自己的虚函数

C++ 继承:子函数使用父虚函数而不是自己的虚函数,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,我在继承方面遇到了问题,我简直无法控制自己。我有三个班,他们之间有家长关系。它们都具有函数calcForces() 现在我的问题是,我创建了一个对象作为帆船(并将其保存在对象指针中),但当我调用calcForces()时,我最终进入了Boat::calcForces(),而不是Sailboat::calcForces()。我做错了什么 下面是我对函数的调用: (*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is

我在继承方面遇到了问题,我简直无法控制自己。我有三个班,他们之间有家长关系。它们都具有函数calcForces()

现在我的问题是,我创建了一个对象作为帆船(并将其保存在对象指针中),但当我调用calcForces()时,我最终进入了Boat::calcForces(),而不是Sailboat::calcForces()。我做错了什么

下面是我对函数的调用:

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

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


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

如果您想在帆船中使用
calcForces()
方法,您应该将它添加到那里。 目前,您的帆船中只有
calcForces(Wind-Wind)
方法(以及继承自
船的
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
};

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

您需要通过指针调用多态行为。试试:
this->object\u ptr\u arr[i]->calcForces()请显示一个。为了避免此类问题,请参阅非常好的建议,并且由于面向对象的方法,因此绝对更可取。但是,如果他将来面临类似的问题,这并没有多大帮助,因为它没有描述他做错了什么。我要提到的是
override
关键字,它的目的是在编译时进行匹配检查并避免错误。@skypjack Done!
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
};