【问题标题】:Pure virtual function overridding virtual function纯虚函数覆盖虚函数
【发布时间】:2013-10-04 15:22:51
【问题描述】:

假设给出以下代码。

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++ Rule 10-3-3:代码分析器给出警告:纯虚函数覆盖非纯虚函数。

但我找不到有关警告的详细信息。上述代码的副作用是什么?这里有什么不好的做法?


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

【问题讨论】:

  • 这是否打算成为 C++11 的 virt-specifier final 的简陋版本? (C++11 10.3p4)
  • 如果发出警告,那么std::is_abstract 是干什么用的?
  • 请检查更新的问题,标准是c++98
  • 好的,让我复习一下,但我需要一些时间,关于 Liskov 可替代性的论文太少了。

标签: c++ inheritance polymorphism c++98 misra


【解决方案1】:

我看不出这里有什么神秘之处。代码分析器可能会根据 MISRA 标准检查您的代码,而不是 C++ 98 标准。

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

您正在用纯虚函数覆盖非纯虚函数,显然编译器可以这样做,但 MISRA 规则不行。

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

【讨论】:

  • 是的,你完全正确,我提到了 C++98,正如 C++11 相关特性所指出的那样。
【解决方案2】:

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

§ 10.4

5 [注意:抽象类可以派生自非抽象类,纯虚函数可以覆盖非纯虚函数。 ——尾注]

【讨论】:

  • 错误警告的不是编译器。但这是 MISRA 规则
  • 这不是虚假报道。 MISHA 认为这是一种不好的做法。 (为什么不将 A::SomeMethod() 声明为虚拟纯?)。它可能像其他一些 MISHA 规则一样被视为滥用。
  • 旁注:这在 C++98 和 C++11 中是相同的。是看两者没有区别,包括引用的章节和段落注释。
  • @Jarod42 正如我在问题中提到的,我没有修改类 A 的权限,但仍然需要一个抽象类 B,可能最好添加一些其他虚拟抽象方法,而不是触摸一些方法?
猜你喜欢
  • 2021-09-30
  • 2022-01-13
  • 2020-08-21
  • 2014-05-22
  • 2013-01-16
  • 2016-02-05
  • 2011-02-24
  • 2021-11-01
  • 2014-03-08
相关资源
最近更新 更多