纯虚函数覆盖虚函数

Pure virtual function overridding virtual function

本文关键字:函数 覆盖      更新时间:2023-10-16

假设给出以下代码。

class A
{
public:
   virtual void someMethod()
   {
      std::cout << "class A" << std::endl;
   }
};
class B : public A
{
public:
   ...
   virtual void someMethod() = 0;
   ...
};

B 使用虚拟方法覆盖someMethod虚拟方法。这样做的目的可能是扩展现有类,在我们的例子中不允许修改类A,但仍然有一个抽象类B它必须是一些进一步类的基类。

根据MISRA-C++规则10-3-3:代码分析器给出警告:纯虚函数覆盖非纯虚函数。

但我找不到有关警告的太多细节。上述代码的副作用是什么?这里的不良做法是什么?


更新:标准是MISRA-C++(C++98)

我在这里看不到任何神秘之处。代码分析器可能会根据 MISRA 标准而不是 C++ 98 标准检查您的代码。

MISRA是一套针对汽车环境的C/C++编码标准,它对语言标准所谓的合法/允许的内容施加了进一步的限制。

你用一个纯虚函数覆盖一个非纯虚函数,显然这对编译器来说是可以的,但对 MISRA 规则来说不是。

也就是说,您的程序将编译和执行良好,并且符合语言标准,但可能不被需要代码审查和符合MISRA标准的客户所接受。

我会说你的代码按照标准是有效的:

§ 10.4

5 [ 注意:抽象类可以从非抽象的类派生,纯虚函数可以覆盖非纯的虚函数

继承是向后的。

它有 A 类由 B 类继承,B 具有纯虚函数。我相信你想要以下代码。它说 B 的子类必须实现 somemethod()。

class B
{
public:
   ...
   virtual void someMethod() = 0;
   ...
};
class A : public B
{
public:
   virtual void someMethod()
   {
      std::cout << "class A" << std::endl;
   }
};