In C++, it is legal to give an implementation of a pure virtual function:
class C { public: virtual int f() = 0; }; int C::f() { return 0; }
Why would you ever want to do this?
Related question: The C++ faq lite contains an example:
class Funct { public: virtual int doit(int x) = 0; virtual ~Funct() = 0; }; inline Funct::~Funct() { } // defined even though it's pure virtual; it's faster this way; trust me
I don't understand why the destructor is declared pure virtual and then implemented; and I don't understand the comment why this should be faster.
A pure virtual function makes it so the base class can not be instantiated, and the derived classes are forced to define these functions before they can be instantiated. This helps ensure the derived classes do not forget to redefine functions that the base class was expecting them to.
A pure virtual function is a function that must be overridden in a derived class and need not be defined. A virtual function is declared to be “pure” using the curious =0 syntax. For example: class Base {
A pure virtual function must be implemented in a derived type that will be directly instantiated, however the base type can still define an implementation.
The main advantage of virtual functions are that they directly support object oriented programming. When you declare a function as virtual you're saying that exactly what code is executed depends on the type of the object you call it against. you can't tell exactly what code path it's going to follow.
Declared destructors must always be implemented as the implementation will call them as part of derived object destruction.
Other pure virtual functions may be implemented if they provide a useful common functionality but always need to be specialized. In the case, typically derived class implementations will make an explicit call to the base implementation:
void Derived::f() { Base::f(); // Other Derived specific functionality }
Typically, you make a destructor virtual if you need to make a class abstract (i.e. prevent non-derived instances from being created) but the class has no other functions that are naturally pure virtual. I think the 'trust me it's faster' is refering to the fact that because destructors called as part of derived object clean up don't need to use a vtable lookup mechanism, the inline implementation can be taken advantage of, unlike typical virtual function calls.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With