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

标签 c++ visual-studio visual-studio-2019 cpp-core-guidelines

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

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

我做错了什么,如何删除指南警告?

最佳答案

我怀疑这种情况下的 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 可以遵循零规则并且不需要声明任何复制/移动赋值运算符和复制/移动构造函数,这是首选方式。

关于c++ - 运算符继承问题和 cpp 核心指南 c.128,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60205956/

相关文章:

c++ - C/C++ 中的运算符在哪里定义以及它们是如何在这些语言中实现的?

c++ - 在 C++ 中获取 double 的精确位表示

c - 防止控制台窗口在 Visual Studio C/C++ 控制台应用程序上关闭

visual-studio - UWP 和 Xamarin 构建失败且没有输出

visual-studio - Angular 项目未在 docker 上使用 Visual Studio 2019 运行

sql - Visual Studio 2019 架构比较未检测到差异

c# - 配置 .editorconfig 中缺少 xml 注释的警告 (Visual Studio 2019)

c++ - C 程序 : Get inode header fields and information by inode number

visual-studio-2010 - 如何仅显示 Visual Studio 2010 (TFS) 中当前打开的解决方案的待定更改,而不显示所有更改的完整列表?

c++ - 使用 WinApi 可靠地知道卷是否可移动