C++ 运算符继承和cpp核心指南c.128存在问题

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

我有以下代码(我删除了一些不重要的代码):

由于我定义了析构函数,并且还需要定义其他东西(如果我记得的话,规则是5),所以我添加了默认操作符来解决一个指导性警告

如果我通过启用cpp核心指导原则使用Visual Studio 2019构建它,我会收到以下警告:

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&)
vs
State&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