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:
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:
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?
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.
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.
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.
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.
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.
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