Virtual Functions
Virtual function (A special override) achieved a runtime polymorphism instead of compile-time. [late binding]
It allowes a child class object but is declared as parent class to call the child functions.
Only accessing via pointer or reference of parent type can achieve the runtime polymorphism.
for deconstructor
Features
- Only parent class need the virtual keyword
- No virtual member variables
- Private/Protected modifier is static, but virtual function is dynamic.
- virtual functions can be defined as public, protected or private in the Parent class. But Attention: modifier is static even with a pointer or reference type
Examples
-
Basic
#include <iostream> using namespace std; class Parent{ public: Parent() { cout << "Parent constructor" << endl; } void display() { cout << "Parent display" << endl; } virtual void virtualDisplay() { cout << "Parent virtual display " << endl; } }; class Child: public Parent{ public: Child() { cout << "Child Constructor" << endl; } void display() { cout << "Child display" << endl; } void virtualDisplay() { cout << "Child virtual display " << endl; } }; void callByReference(Parent & p){ p.virtualDisplay(); } void callByValue(Parent p){ p.virtualDisplay(); } int main(){ Child c; // "Parent constructor /n Child constructor" Parent p2 = c; /* it is just an assignment, but p2 is staticly bind to c's inherited parent method*/ Parent * p = &c; p->display(); // Parent display p->virtualDisplay(); // Child virtual display p2.virtualDisplay(); // Parent virtual display callByReference(c); //Child virtual display callByValue(c); //Parent virtual display return 0; }
-
Protected virtual function: provide an encapsulation
#include <iostream> using namespace std; class Parent{ public: Parent(); void display(); protected: virtual void virtualDisplay(); }; Parent::Parent(){ cout << "Parent constructor" << endl; } void Parent::display(){ // do something virtualDisplay(); // do something } void Parent::virtualDisplay(){ cout << "Parent virutal display" << endl; } //======== class Child: public Parent{ public: Child(); protected: void virtualDisplay(); }; Child::Child(){ cout << "Child Constructor" << endl; } void Child::virtualDisplay(){ cout << "Child virtual display " << endl; } void callByReference(Parent & p){ p.display(); } void callByValue(Parent p){ p.display(); } int main(){ Child c; // Parent constructor /n Child constructor Parent p2 = c; Parent * p = &c; p->display(); // Child virtual display callByReference(c); //Child virtual display callByValue(c); //Parent virtual display return 0; }
-
Static binded modifier
#include <iostream> using namespace std; class F{ private: virtual void func(){cout << "Parent Private virtual function" << endl;} }; class E: public F{ public: void func(){cout << "Child Public virtual function" << endl;} }; int main(){ E e; F * f = &e; e.func(); //f->func(); private modifer static bind }