运算符继承和 cpp 核心准则 c.128 的问题
Problem with operator inheritance and cpp core guidelines c.128
我有以下代码(我删除了一些在这里不重要的代码(:
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.html 和 https://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
可以遵循零规则,并且不需要声明的任何复制/移动赋值运算符和复制/移动构造函数,这是首选方法。
基本上,为了覆盖任何方法,重写方法的签名需要与原始方法签名相同。但是,在您的情况下,签名SimpleState& operator=(const SimpleState&)
与State& operator=(const State&)
是不同的。因此,您不是重写原始方法,而是将该方法声明为重写,因此会出现错误。
- 混合组合和继承的C++问题
- 运算符继承和 cpp 核心准则 c.128 的问题
- 类继承,ENUM 与 AST 类实现的问题
- C++ 多级虚拟继承编译问题
- 如何解决此问题(基础模板和继承)
- 模板继承问题
- C++ 继承向量问题(无限循环+在其他类中使用向量的问题)
- 我是否需要在虚拟继承类的构造函数中初始化基类以解决菱形继承问题?
- 继承此C++代码有什么问题
- 一个关于继承和引用的C++问题
- C++继承和"常量"交互的问题
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- C++的抽象类继承和构造函数的问题
- C++:继承和列表函数作为类成员的问题
- SIGSEGV 因为基/派生类的继承问题
- 关于异常继承中的语法的问题
- C++继承的类设计问题
- 关于继承和覆盖的问题
- C++ 构造函数问题 // 继承的类
- 对复制构造函数的c++ OOP程序问题?继承