【发布时间】:2020-04-10 19:31:54
【问题描述】:
所以我在派生类中重写纯虚函数时遇到了问题。 类的实现和声明如下所示:
class Base{
private:
size_t id;
public:
virtual bool isEqual(const Base& src) const =0;
};
class Derived: public Base{
private:
string str;
public:
virtual bool isEqual(const Derived& src) const override
{
return (this->str == src.str);
}
};
所以当我像这样实现它时,它会遇到编译器错误,例如
member function declared with 'override' does not override a base class member function
能否请您告诉我如何才能做到这一点,并解释一下为什么我的版本不起作用。提前致谢!
【问题讨论】:
-
因为参数不同,您没有覆盖基类函数。要覆盖一个函数,您需要指定完全相同的签名。
-
我知道参数是不同的,但我需要让它们不同,因为基类中不包含
string str数据成员,编译器会在我的 isEqual 中特别抛出错误覆盖成员函数...所以我想我应该重载该函数并删除使其成为纯虚函数的=0部分?? -
@VissarionMoutafis 错误,
Derived是Base。因此,您可以使用相同的签名(采用const Base &)覆盖它并传递Derived对象将正常工作。在函数体中可以dynamic_cast。如果失败,您可以抛出异常或任何您想要的(给出错误类型,Derived预期,...)。 -
... 或者在给定的情况下简单地返回 false:如果类型不匹配,则对象也不能相等。
-
@VissarionMoutafis 如果
dynamic_cast失败,您仅返回 false。如果是这样,则您有不同的对象类型,并且它们不能相等。 否则您现在已经按照预期返回字符串比较的结果。
标签: c++ overriding abstract-class virtual-functions