Can I override a virtual function with a pure virtual one?

感情迁移 提交于 2020-03-13 04:42:33

问题


I have three classes: B, D and G. D is a B and G is a D. Both B and D are abstract. B is from a third party.

B has a non-pure, virtual method that G needs to implement (to be a D). Can I and is it good practice to redefine/override a virtual function to be pure virtual?

Example:

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
}

To the question of "can I?" gcc allows it, but I do not have the terms/vocabulary to verify the behavior is part of the standard or is undefined and happens to work today.


回答1:


You asked:

Can I override a virtual function with a pure virtual one?

The answer is: Yes, you can. From the C++11 standard:

10.4 Abstract classes

5 [ Note: An abstract class can be derived from a class that is not abstract, and a pure virtual function may override a virtual function which is not pure. —end note ]




回答2:


If you compile the code with a more modern compiler then you'll get the following error messages that explain the problem

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.

As for the Standard then (10.3 Virtual functions)

11 A virtual function declared in a class shall be defined, or declared pure (10.4) in that class, or both; but no diagnostic is required (3.2).



来源:https://stackoverflow.com/questions/33526666/can-i-override-a-virtual-function-with-a-pure-virtual-one

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!