C++ 继承:子函数使用父虚函数而不是自己的虚函数
我在继承方面遇到了问题,我简直无法控制自己。我有三个班,他们之间有家长关系。它们都具有函数calcForces() 现在我的问题是,我创建了一个对象作为帆船(并将其保存在对象指针中),但当我调用calcForces()时,我最终进入了Boat::calcForces(),而不是Sailboat::calcForces()。我做错了什么 下面是我对函数的调用: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
(*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
};