vamsi
vamsi

Reputation: 1767

virtual function const vs virtual function non-const

class Base
{
   public:
   virtual void func() const
   {
     cout<<"This is constant base "<<endl;
   }
};

class Derived : public Base
{
   public:
   virtual void func()
   {
     cout<<"This is non constant derived "<<endl;
   }
};


int main()
{
  Base *d = new Derived();
  d->func();
  delete d;

  return 0;
}

Why does the output prints "This is constant base". However if i remove const in the base version of func(), it prints "This is non constant derived"

d->func() should call the Derived version right, even when the Base func() is const right ?

Upvotes: 22

Views: 44713

Answers (3)

Sarfaraz Nawaz
Sarfaraz Nawaz

Reputation: 361352

 virtual void func() const  //in Base
 virtual void func()        //in Derived

const part is actually a part of the function signature, which means the derived class defines a new function rather than overriding the base class function. It is because their signatures don't match.

When you remove the const part, then their signature matches, and then compiler sees the derived class definition of func as overridden version of the base class function func, hence the derived class function is called if the runtime type of the object is Derived type. This behavior is called runtime polymorphism.

Upvotes: 44

stinky472
stinky472

Reputation: 6797

virtual void func() is actually of a different signature than virtual void func() const. Thus you didn't override your original, read-only base function. You ended up creating a new virtual function instead in Derived.

You can also learn more about this if you ever try to create pointers to member functions (PTMFs), but that's a rare necessity (might be good for study or practice, however).

The override keyword in C++11 is particularly handy to help avoid these kinds of mistakes. The compiler would then tell you that your definition of 'func' in derived does not override anything.

Upvotes: 5

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272467

No, because virtual void func() is not an override for virtual void func() const.

Upvotes: 4

Related Questions