gpt4 book ai didi

c++ - 如何使用覆盖函数中的子类引用覆盖纯虚函数

转载 作者:行者123 更新时间:2023-12-01 15:05:23 24 4
gpt4 key购买 nike

所以我有一个问题要在派生类中重写纯虚函数。
类的实现和声明如下所示:

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

您能否告诉我我如何才能正确解决问题,也许可以向我解释为什么我的版本无法正常工作。提前致谢!

最佳答案

您不能以这种方式更改函数签名–有关详细信息,请阅读co- and contravariance,以及为什么C++不允许同时使用函数参数(允许使用协变量返回类型)。

另一方面,如果通过引用base引用了另一个对象,则根本不会调用覆盖(实际上是:重载!)函数:

Derived d1;
Derived d2;
Base& b2 = d2;

d1.isEqual(b2); // how do you imagine the derived version to get called now???

解决方案的关键是 dynamic_cast:
struct Base
{
virtual ~Base() { }
virtual bool operator==(Base const& other) = 0;
};

struct Derived : Base
{
bool operator==(Base const& other) override
{
auto o = dynamic_cast<Derived const*>(&other);
return o && o->str == this->str;
}
};

请注意,我将函数重命名为 operator==;这在C++中自然得多。这样,您可以在上面的示例中将以下内容进行比较:
bool isEqual = d1 == b2;

编辑:

The teacher told us that we must not overload operator



好吧,然后恢复命名即可……实际上,运算符与其他函数一样,都与普通函数一样,只是调用语法不同(实际上:存在另一种变体,您也可以始终称为 d1.operator ==(d2))。

关于c++ - 如何使用覆盖函数中的子类引用覆盖纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59388766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com