Can I override a virtual function with a pure virtual one?
Asked Answered
P

2

29

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.

Preparedness answered 4/11, 2015 at 16:12 Comment(0)
A
25

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 ]

Archaeornis answered 4/11, 2015 at 16:26 Comment(2)
I didn't really understand the answer. Is the method foo() in G pure virtual, or not?Jaclin
@BЈовић, yes. foo is pure virtual in G.Archaeornis
U
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).

Unsnarl answered 4/11, 2015 at 16:18 Comment(4)
Yes, I desire that error (if this whole paradigm is supported by the compiler and seems reasonable to other programmers).Preparedness
@Preparedness However as it follows from the compiler messages gcc 4.8.2 behaves differently.Unsnarl
"No diagnostic is required". Does that mean the compiler is allowed to accept this without error? If so, what will the compiled code do?Marla
@Marla The program will be ill-formed.Unsnarl

© 2022 - 2024 — McMap. All rights reserved.