gpt4 book ai didi

c++ - 什么时候派生类需要将方法实现为const?

转载 作者:太空狗 更新时间:2023-10-29 21:35:39 26 4
gpt4 key购买 nike

为什么在下面的例子中 CC::onError 不需要是 const? BB:onError 必须是 const 否则编译器错误。

BB 需要将 onError 实现为 const else 编译器错误。

CC 可以实现为非常量。为什么?

class AA  {
public:
AA() {};
virtual ~AA() {};

// On any error
virtual void onError(int32_t error) const = 0;
};

class BB : public AA {
public:
BB() {};
virtual ~BB() {};

virtual void onError(int32_t error) const {
//changing x is invalid here due to const
//method required to be const else compiler error
}
protected:
int x;
};

class CC : public BB {
public:
CC() {};
virtual ~CC() {};

virtual void onError(int32_t error) {
x = 5;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
CC c;
return 0;
}

最佳答案

Why doesn't CC::onError need be const in the below example? 

因为成员函数不需要是 const

问题是您希望它覆盖 A::onError,这就是为什么 C++11 引入了 override 关键字。
这是一个微妙的错误,但事实是您没有覆盖 A::onError。您在 C 中声明了一个新的虚拟成员函数,它实际上隐藏了 A::onError
尝试使用这个:

class CC : public BB {
public:
CC() {};
virtual ~CC() {};

virtual void onError(int32_t error) override {
x = 5;
}
};

编译器会明确告诉你错误是什么:

error: 'virtual void CC::onError(int32_t)' marked 'override', but does not override

另一方面,下面的代码是正确的(至少它按预期覆盖了 A:onError)但事实上它不能编译,因为你不能修改 xonError const:

virtual void onError(int32_t error) const override  {
x = 5;
}

当然,除非您将 x 定义为 mutable:

mutable int x;

我不推荐它,因为 mutable 用于稍微不同的情况,但是 it works .

关于c++ - 什么时候派生类需要将方法实现为const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41787791/

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