我能覆盖虚函数用一个纯虚函数吗?

29

我有三个类:BDGD是一个B,而G是一个DBD都是抽象的,而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个回答

25
您的问题是:“我可以用一个纯虚函数覆盖虚函数吗?”
答案是:可以。根据C++11标准规定:
10.4 抽象类 5 [注:抽象类可以派生自非抽象类,而纯虚函数可以覆盖一个不是纯虚的虚函数。——注解结束]
请注意保留原有的HTML标签格式。

我并没有真正理解这个答案。G 中的 foo() 方法是纯虚拟的吗?还是不是? - BЈовић
1
@BЈовић,是的。在G中,foo是纯虚函数。 - R Sahu

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)。


是的,我希望出现那个错误(如果整个程序范式被编译器所支持,并且在其他程序员看来也合理)。 - jtooker
@jtooker,然而从编译器消息中可以看出,gcc 4.8.2的行为有所不同。 - Vlad from Moscow
不需要诊断。这是否意味着编译器可以接受此内容而不出错?如果是,那么编译后的代码会做什么? - PieterNuyts
@PieterNuyts 程序将无法正常运行。 - Vlad from Moscow

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