继承:Child 使用 parent 虚函数而不是它自己的
Inheritance: Child uses parent virtual function instead of its own
我在继承方面遇到了这个问题,我无法理解。我有三个 类,他们之间有亲子关系。它们都有函数 calcForces().
class Object {
public:
virtual void calcForces();
};
class Boat : public Object {
public:
virtual void calcForces();
};
class Sailboat : public Boat {
public:
void calcForces(Wind wind);
};
现在我的问题是我创建了 object 作为 Sailboat(并将其保存在 Object-pointer 中),但是当我调用 calcForces() 我最终进入 Boat::calcForces(),而不是 Sailboat::calcForces() .我究竟做错了什么?
这是我对函数的调用:
(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**'
覆盖的声明必须匹配。您对 Sailboat::calcForces
的声明采用不同的参数(Wind
实例),因此不是覆盖。
正如@stefaanv 和@skypjack 所评论的,您可以通过使用 override
函数说明符来避免此问题,这会在编译时捕获错误。
如果您想在帆船中使用 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
};
现在您可以修改环境并要求环境中的所有 objects 计算他们的力量。无论是小船、帆船还是海豚。
我在继承方面遇到了这个问题,我无法理解。我有三个 类,他们之间有亲子关系。它们都有函数 calcForces().
class Object {
public:
virtual void calcForces();
};
class Boat : public Object {
public:
virtual void calcForces();
};
class Sailboat : public Boat {
public:
void calcForces(Wind wind);
};
现在我的问题是我创建了 object 作为 Sailboat(并将其保存在 Object-pointer 中),但是当我调用 calcForces() 我最终进入 Boat::calcForces(),而不是 Sailboat::calcForces() .我究竟做错了什么?
这是我对函数的调用:
(*this->object_ptr_arr[i]).calcForces(); //'object_ptr_arr' is of type 'Object**'
覆盖的声明必须匹配。您对 Sailboat::calcForces
的声明采用不同的参数(Wind
实例),因此不是覆盖。
正如@stefaanv 和@skypjack 所评论的,您可以通过使用 override
函数说明符来避免此问题,这会在编译时捕获错误。
如果您想在帆船中使用 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
};
现在您可以修改环境并要求环境中的所有 objects 计算他们的力量。无论是小船、帆船还是海豚。