Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Overriding non-virtual methods

Tags:

c++

overriding

Let's assume this scenario in Visual C++ 2010:

#include <iostream> #include <conio.h>  using namespace std;  class Base { public:     int b;     void Display()     {         cout<<"Base: Non-virtual display."<<endl;     };     virtual void vDisplay()     {         cout<<"Base: Virtual display."<<endl;     }; };  class Derived : public Base { public:     int d;     void Display()     {         cout<<"Derived: Non-virtual display."<<endl;     };     virtual void vDisplay()     {         cout<<"Derived: Virtual display."<<endl;     }; };  int main() {     Base ba;     Derived de;      ba.Display();     ba.vDisplay();     de.Display();     de.vDisplay();      _getch();     return 0; }; 

Theoretically, the output of this little application should be:

  • Base: Non-virtual display.
  • Base: Virtual display.
  • Base: Non-virtual display.
  • Derived: Virtual display.

because the Display method of the Base class is not a virtual method so the Derived class should not be able to override it. Right?

The problem is that when I run the application, it prints this:

  • Base: Non-virtual display.
  • Base: Virtual display.
  • Derived: Non-virtual display.
  • Derived: Virtual display.

So either I didn't understand the concept of virtual methods or something strange happens in Visual C++.

Could someone help me with an explanation?

like image 751
Leif Lazar Avatar asked Jun 17 '12 00:06

Leif Lazar


People also ask

Can we override a non-virtual method?

You cannot override a non-virtual or static method. The overridden base method must be virtual , abstract , or override . An override declaration cannot change the accessibility of the virtual method. Both the override method and the virtual method must have the same access level modifier.

Can we override non-virtual method in Java?

Base: Non-virtual display. because the Display method of the Base class is not a virtual method so the Derived class should not be able to override it.

Can we override virtual as well as non-virtual methods?

No, you cannot override a non-virtual method. The closest thing you can do is hide the method by creating a new method with the same name but this is not advisable as it breaks good design principles.

Can we override virtual method in C#?

You cannot override a non-virtual method. Virtual properties behave like virtual methods, except for the differences in declaration and invocation syntax. It is an error to use the virtual modifier on a static property.


1 Answers

Yep, you are misunderstanding a little.

The method of the same name on the derived class will hide the parent method in this case. You would imagine that if this weren't the case, trying to create a method with the same name as a base class non-virtual method should throw an error. It is allowed and it's not a problem - and if you call the method directly as you have done it will be called fine.

But, being non-virtual, C++ method lookup mechanisms that allow for polymorphism won't be used. So for example if you created an instance of your derived class but called your 'Display' method via a pointer to the base class, the base's method will be called, whereas for 'vDisplay' the derived method would be called.

For example, try adding these lines:

Base *b = &ba; b->Display(); b->vDisplay(); b = &de; b->Display(); b->vDisplay(); 

...and observe the output as expected:

Base: Non-virtual display.
Base: Virtual display.
Base: Non-virtual display.
Derived: Virtual display.

like image 198
sje397 Avatar answered Sep 30 '22 08:09

sje397