C++ 运算符继承和cpp核心指南c.128存在问题
我有以下代码(我删除了一些不重要的代码): 由于我定义了析构函数,并且还需要定义其他东西(如果我记得的话,规则是5),所以我添加了默认操作符来解决一个指导性警告 如果我通过启用cpp核心指导原则使用Visual Studio 2019构建它,我会收到以下警告:C++ 运算符继承和cpp核心指南c.128存在问题,c++,visual-studio,visual-studio-2019,cpp-core-guidelines,C++,Visual Studio,Visual Studio 2019,Cpp Core Guidelines,我有以下代码(我删除了一些不重要的代码): 由于我定义了析构函数,并且还需要定义其他东西(如果我记得的话,规则是5),所以我添加了默认操作符来解决一个指导性警告 如果我通过启用cpp核心指导原则使用Visual Studio 2019构建它,我会收到以下警告: SimpleState.hpp: warning C26456: Operator 'SimpleState::operator=' hides a non-virtual operator 'State::operator=' (c.1
SimpleState.hpp: warning C26456: Operator 'SimpleState::operator=' hides a non-virtual operator 'State::operator=' (c.128).
SimpleState.hpp: warning C26456: Operator 'SimpleState::operator=' hides a non-virtual operator 'State::operator=' (c.128).
我想摆脱它,所以我用以下方式更改了代码:
class State {
public:
virtual void enter() = 0;
virtual void update() = 0;
virtual void exit() = 0;
public:
virtual State& operator=(const State&) = 0;
virtual State& operator=(State&&) = 0;
};
class SimpleState : public State {
public:
SimpleState() = default;
SimpleState(const SimpleState&) = default;
SimpleState(SimpleState&&) = default;
virtual ~SimpleState() = default;
public:
void enter() override;
void update() override;
void exit() override;
public:
SimpleState& operator=(const SimpleState&) override = default;
SimpleState& operator=(SimpleState&&) override = default;
};
但在这种情况下,我得到以下错误:
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods
我做错了什么以及如何删除准则警告?基本上,为了覆盖任何方法,覆盖方法的签名需要与原始方法签名相同。但是,在您的情况下,签名不同于
SimpleState&operator=(const-SimpleState&)
vsState&operator=(const-State&)
。因此,您没有覆盖原始方法,而是将该方法声明为覆盖,因此出现错误。我怀疑本例中的C26456警告是一个错误,另请参见和
引用的核心准则子句仅适用于虚拟成员函数,但操作符=
在基类中不是虚拟的,并且它也没有与派生类中相同的签名,因此没有理由应用它
确保确实需要在
SimpleState
中使用析构函数声明。在基类State
中有虚拟函数,这似乎表明您希望以多态方式使用State
,并且对象可能通过State
指针而不是SimpleState
指针销毁。在这种情况下,State
需要声明一个虚拟析构函数,而不是SimpleState
如果将虚拟析构函数声明为
状态
,则不需要在SimpleState
中声明任何析构函数,它将从状态
继承虚拟析构函数。然后,SimpleState
可以遵循零规则,不需要声明任何复制/移动赋值运算符和复制/移动构造函数,这是首选方法。我建议您改为使用。让编译器为您生成构造函数、析构函数和赋值运算符。我首先这样做了,并且我获得了另一个cpp核心指南警告,告诉我虚拟析构函数对于派生类是显式的。我已经添加了它,然后我得到了这个问题。@Jepessen核心指南是指南,而不是更多。您必须评估每种情况下是否需要更改,并且需要阅读中的相应部分以确定如何以及是否采取行动。因为警告这么说而添加东西只会让事情变得更糟。然后请阅读的第一句话(也适用于五的规则):“如果一个类需要一个用户定义的析构函数…”(强调我的)。如果您没有明确定义(实现)析构函数,那么您没有违反“规则”。好的,谢谢您的建议。我们现在开始测试这些指导原则,因此我们需要详细介绍它们的更多经验。State&operator=(const State&)
一开始就不是虚拟的,所以它永远不能被覆盖,这就是为什么我怀疑警告是一个bug。这是我的初衷。我添加了虚拟析构函数,因为cpp核心指南抱怨它丢失了,所以我添加了虚拟析构函数,然后他们抱怨规则5。因此,基本上我可以返回到在SimpleState
@Jepessen Yes中实现零规则的原始代码,但不要忘记添加virtual~State()=default代码>至状态
。然后,您可以在状态下默认复制/移动操作
,以满足规则5。
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods
SimpleState.hpp: error C3668: 'SimpleState::operator =': method with override specifier 'override' did not override any base class methods