我可以使用纯虚拟功能覆盖虚拟功能吗?

时间:2015-11-04 16:12:26

标签: c++ c++11 virtual language-lawyer pure-virtual

我有三个课程:BDGDBGDBD都是抽象的。 B来自第三方。

B有一个G需要实现的非纯虚拟方法(成为D)。我可以 重新定义/覆盖虚拟功能是纯虚拟的好习惯吗?

示例:

class B // from a third party
{
public:
   virtual void foo();
};

class D : public B
{
public:
   void foo() override = 0; // allowed by gcc 4.8.2
   virtual void bar() = 0;
};

class G : public D
{
public:
   // forgot to reimplement foo
   void bar() override;
};

int main()
{
   G test;  // compiler error is desired
}

关于“我可以吗?”的问题gcc允许它,但我没有术语/词汇表来验证行为是标准的一部分,还是未定义,并且恰好在今天工作。

2 个答案:

答案 0 :(得分:23)

你问:

  

我可以使用纯虚拟功能覆盖虚拟功能吗?

答案是:是的,你可以。从C ++ 11标准:

  

10.4抽象类

     

5 [注意:抽象类可以从非抽象的类派生,纯虚函数可以覆盖不纯的虚函数。 - 结束记录]

答案 1 :(得分:2)

如果使用更现代的编译器编译代码,那么您将收到以下错误消息来解释问题

prog.cc:23:6: error: variable type 'G' is an abstract class
   G test;  // compiler error is desired
     ^
prog.cc:10:9: note: unimplemented pure virtual method 'foo' in 'G'
   void foo() override = 0; // allowed by gcc 4.8.2
        ^
1 error generated.

至于标准(10.3虚拟功能)

  

11定义中声明的虚拟函数或   在该类中声明纯粹(10.4),或两者兼而有之;但没有诊断   要求(3.2)。