纯虚函数覆盖虚函数

8
假设已经给出以下代码。
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)。

如果这会产生警告,那么 std::is_abstract 有什么用呢? - raina77ow
请检查更新后的问题,标准为C++98。 - deimus
可能是从具体类派生抽象类的重复问题。 - raina77ow
好的,让我检查一下,但是需要一些时间,Liskov的可替代性论文相当长。 - deimus
为了修复警告,您可以使用类似以下代码的方式:class B : public A { public: virtual void someMethod() {someMethodB();} virtual void someMethodB() = 0; }; - Jarod42
显示剩余3条评论
3个回答

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

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

您正在使用纯虚函数覆盖非纯虚函数,显然编译器是可以接受的,但MISRA规则禁止这样做。

也就是说,您的程序可以编译并正常运行,并且符合语言标准,但如果客户需要进行代码审查并符合MISRA标准,则可能无法被接受。


是的,你绝对是正确的,我提到了C++98,因为指出了与C++11相关的特性。 - deimus

3
我觉得你的代码符合标准:
§ 10.4
注意:一个抽象类可以由非抽象类派生,而一个纯虚函数可以覆盖一个不是纯虚的虚函数。

1
不是编译器发出了错误警告,而是MISRA规则。 - BЈовић
这不是虚假报告。MISHA认为这是一种不良实践。(为什么不将A :: SomeMethod()声明为虚拟纯函数?)这可能被视为滥用其他MISHA规则之一。 - Jarod42
旁注:这在C++98和C++11中是相同的。我看不出两者之间有任何区别,包括引用的部分和段落注释。 - WhozCraig
@Jarod42,正如我在问题中提到的,我没有修改A类的访问权限,但仍需要一个抽象类B,可能最好添加一些其他虚拟抽象方法,而不是触及someMethod? - deimus

0

继承是反向的。

有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;
   }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接