I have three classes: B, D and G. D is a B and G is a D. Both B and
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).