问题
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