操作符继承问题和cpp核心准则c.128

问题描述 投票:1回答:2

我正在关注代码(我删除了一些不重要的代码):

class State {
public:

  virtual void enter() = 0;
  virtual void update() = 0;
  virtual void exit() = 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&) = default;
  SimpleState& operator=(SimpleState&&) = default;
};

由于我已经定义了析构函数,并且还需要定义其他内容(如果记得,则为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

我做错了,如何删除准则警告?

c++ visual-studio visual-studio-2019 cpp-core-guidelines
2个回答
2
投票

我怀疑在这种情况下C26456警告是一个错误,另请参阅https://developercommunityapi.westus.cloudapp.azure.com/content/problem/617702/c26456-false-positive-with-operator-in-derived-cla.htmlhttps://developercommunity.visualstudio.com/content/problem/228085/c-core-check-false-positive-c26434.html

所引用的核心准则子句C.128仅适用于虚拟成员函数,但是operator=在您的基类中不是虚拟的,并且与派生类中的签名也不相同,因此没有理由这样做申请。


请确保您确实想要SimpleState中的析构函数声明。您在基类State中具有虚函数,这似乎表明您想多态使用State,并且对象可能是通过State指针而不是SimpleState指针破坏的。在那种情况下,State需要声明一个虚拟析构函数,而不是SimpleState

如果在State中声明虚拟析构函数,则无需在SimpleState中声明任何析构函数,这将继承State的虚拟析构函数。然后SimpleState可以遵循零规则,并且不需要声明任何复制/移动赋值运算符和复制/移动构造函数,这是首选方法。


0
投票

[基本上,为了覆盖任何方法,覆盖方法的签名必须与原始方法签名相同。但是,在您的情况下,签名SimpleState& operator=(const SimpleState&)State& operator=(const State&)不同。因此,您不是要覆盖原始方法,而是将方法声明为覆盖,因此会出错。

© www.soinside.com 2019 - 2024. All rights reserved.