Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do ALL virtual functions need to be implemented in derived classes?

This may seem like a simple question, but I can't find the answer anywhere else.

Suppose I have the following:

class Abstract { public:     virtual void foo() = 0;     virtual void bar(); }  class Derived : Abstract { public:     virtual void foo(); } 

Is it ok that class Derived does not implement the bar() function? What if not ALL of my derived classes need the bar() function, but some do. Do all of the virtual functions of an abstract base class need to be implemented in the derived classes, or just the ones that are pure virtual? Thanks

like image 620
mikestaub Avatar asked Jan 19 '12 18:01

mikestaub


People also ask

Is it necessary to define virtual function in derived?

The virtual keyword can be used when declaring overriding functions in a derived class, but it is unnecessary; overrides of virtual functions are always virtual. Virtual functions in a base class must be defined unless they are declared using the pure-specifier.

Is it always mandatory to implement or define all the pure virtual function of the base class into derived class?

It is not mandatory for the derived class to override (or re-define the virtual function), in that case, the base class version of the function is used. A class may have virtual destructor but it cannot have a virtual constructor.

Does virtual function have different functionality in derived class?

A virtual function is a member function of a base class that is overridden by a derived class. When you use a pointer or a reference to the base class to refer to a derived class object, you can call a virtual function for that object and have it run the derived class's version of the function.

What happens when a derived class does not override a virtual function?

If you don't override a pure virtual function in a derived class, that derived class becomes abstract: class D2 : public Base { // no f1: fine. // no f2: fine, we inherit Base::f2.


2 Answers

Derived classes do not have to implement all virtual functions themselves. They only need to implement the pure ones.1 That means the Derived class in the question is correct. It inherits the bar implementation from its ancestor class, Abstract. (This assumes that Abstract::bar is implemented somewhere. The code in the question declares the method, but doesn't define it. You can define it inline as Trenki's answer shows, or you can define it separately.)


1 And even then, only if the derived class is going to be instantiated. If a derived class is not instantiated directly, but only exists as a base class of more derived classes, then it's those classes that are responsible for having all their pure virtual methods implemented. The "middle" class in the hierarchy is allowed to leave some pure virtual methods unimplemented, just like the base class. If the "middle" class does implement a pure virtual method, then its descendants will inherit that implementation, so they don't have to re-implement it themselves.

like image 159
Rob Kennedy Avatar answered Oct 05 '22 19:10

Rob Kennedy


Only the pure virtual methods have to be implemented in derived classes, but you still need a definition (and not just a declaration) of the other virtual methods. If you don't supply one, the linker might very well complain.

So, just putting {} after your optional virtual method gives you an empty default implementation:

class Abstract { public:     virtual void foo() = 0; // pure virtual must be overridden     virtual void bar() {}   // virtual with empty default implementation };  class Derived : Abstract { public:     virtual void foo(); }; 

A more involved default implementation would go into a separate source file though.

like image 33
trenki Avatar answered Oct 05 '22 20:10

trenki