首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >纯虚函数过脊虚函数

纯虚函数过脊虚函数
EN

Stack Overflow用户
提问于 2013-09-28 10:20:56
回答 3查看 744关注 0票数 8

假设给出了以下代码。

代码语言:javascript
复制
class A
{
public:
   virtual void someMethod()
   {
      std::cout << "class A" << std::endl;
   }
};

class B : public A
{
public:
   ...
   virtual void someMethod() = 0;
   ...
};

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

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-09-28 10:45:42

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

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

您正在使用一个纯虚拟函数重写一个非纯虚拟函数,显然这在编译器中是可以的,但是对于MISRA规则则不是这样。

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

票数 6
EN

Stack Overflow用户

发布于 2013-09-28 10:33:52

我认为您的代码按照标准是有效的:

第10.4节

注:抽象类可以从非抽象类派生,和纯虚函数可以覆盖非纯的虚函数。-end注记

票数 3
EN

Stack Overflow用户

发布于 2022-04-09 01:21:39

继承是反向的。

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

代码语言:javascript
复制
class B
{
public:
   ...
   virtual void someMethod() = 0;
   ...
};

class A : public B
{
public:
   virtual void someMethod()
   {
      std::cout << "class A" << std::endl;
   }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19065836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档