Полиморфизм времени выполнения в различных типах наследования в C ++
C ++ позволяет пользователям использовать концепцию полиморфизма времени выполнения с использованием виртуальных функций для любого типа наследования.
Below is how to implement Run-Time Polymorphism in all types of inheritance:
- Single Inheritance:
// C++ program to demonstrate Run Time// Polymorphism in Single Inheritance#include <iostream>usingnamespacestd;// Base ClassclassBase {public:// Virtual functionvirtualvoidfunct1(){cout <<"Base::funct1() is called ";}// Virtual functionvirtualvoidfunct2(intx){cout <<"Base"s Val of x:"<< x << endl;}// Non-Virtual Functionvoidfunct3(){cout <<"Base is the Parent class!"<< endl;}};// Derived Class or Sub ClassclassDerived :publicBase {private:// Virtual Functions// can also be Private!voidfunct1(){cout <<"Derived::funct1() is called ";}voidfunct2(intx){cout <<"Derived Class"s Val of x:"<< x << endl;}voidfunct3(){cout <<"It"s the Derived class"s"<<" funct3() called!"<< endl;}};intmain(){// Run-Time Polymorphism// in Single InheritanceBase* bptr =newDerived();// virtual functionbptr->funct1();// virtual functionbptr->funct2(12);// Non-virtual functionbptr->funct3();return0;}Output:Derived::funct1() is called Derived Class"s Val of x:12 Base is the Parent class!
- Multiple Inheritance:
#include <iostream>usingnamespacestd;// Parent to Derived classclassBase1 {public:// Non-Virtual functionvoidfunct1(){cout <<"Base1::funct1() is called ";}// Virtual functionvirtualvoidfunct2(intx){cout <<"Base1"s Val of x:"<< x << endl;}// Non-Virtual Functionvoidfunct3(){cout <<"Base1 is the Parent class!"<< endl;}};// Second Parent to Derived classclassBase2 {public:voidfunct1(){cout <<"Base2::funct1() is called ";}voidfunct2(intx){cout <<"Base2"s Val of x:"<< x << endl;}// Only Virtual Function// in Base2 Parent classvirtualvoidfunct3(){cout <<"Base2 is Also a Parent class!"<< endl;}};// Derived Class of Base1 and Base2classDerived :publicBase1,publicBase2 {private:voidfunct1(){cout <<"Derived::funct1() is called ";}voidfunct2(intx){cout <<"Derived Class"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Derived::funct3() is called "<<"and not Base2::funct3() due"<<" to RTP"<< endl;}};intmain(){Derived d;// Run-Time Polymorphism// in Multiple InheritanceBase1* b1ptr = &d;// Compile-Time Binding,// Hence Base1::funct1() will be called!b1ptr->funct1();// virtual function of Base1// RunTime PolyMorphismb1ptr->funct2(10);// Now Parent Class Base2// is also pointed to object "d"// of Derived (to demonstrate RTP)Base2* b2ptr = &d;// virtual function of Base2// RunTime PolyMorphismb2ptr->funct3();return0;}Output:Base1::funct1() is called Derived Class"s Val of x:10 Derived::funct3() is called and not Base2::funct3() due to RTP
Note: Here Both Base1 pointer and Base2 pointer may be pointing to the same Derived Class object ‘d’ but actually the Compiler selects difference Virtual Functions during Run-Time due to the use of different Base Class pointers.
- Multi-level inheritance:
// C++ Program to illustrate Run-Time// Polymorphism in multi-level inheritance#include <iostream>usingnamespacestd;// Parent ClassclassBase1 {public:// Virtual functionvirtualvoidfunct1(){cout <<"Base1::funct1() is called ";}// Virtual functionvirtualvoidfunct2(intx){cout <<"Base1"s Val of x:"<< x << endl;}// Non-Virtual Functionvoidfunct3(){cout <<"Base1 is the Parent class!"<< endl;}};// Derived Class of Base1// but Parent to Base3classBase2 :publicBase1 {// Virtual Functions can be Private!private:voidfunct1(){cout <<"Base2::funct1() is called ";}voidfunct2(intx){cout <<"Base2"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Base2 is the first "<<"Derived class!"<< endl;}};// Derived Class of Base2// but Parent to DerivedclassBase3 :publicBase2 {private:voidfunct1(){cout <<"Base3::funct1() is called ";}voidfunct2(intx){cout <<"Base3"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Class Base3 is second "<<"Derived class!"<< endl;}};// 3 Levels of Multi-Level Inheritance// and final Child ClassclassDerived :publicBase3 {private:voidfunct1(){cout <<"Derived::funct1() is called ";}voidfunct2(intx){cout <<"Derived Class"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Class Derived is Final"<<" Child class!"<< endl;}};intmain(){// Run-Time Polymorphism// in multi-level InheritanceBase1* b1ptr =newDerived;b1ptr->funct1();b1ptr->funct2(30);// Compile-Time Bindingb1ptr->funct3();return0;}Output:Derived::funct1() is called Derived Class"s Val of x:30 Base1 is the Parent class!
Explanation : In the above Example, the Derived class is the final Child class which inherits from Base3 which inherits from Base2 which again finally inherits from the Base1 (Parent Class to Base2). But if you see the Run-Time Polymorphism works even when you are trying to use Virtual Functions in Base1 Class and point its pointer to Derived Class (Which is the great grand-Child of Base1). Hence, even here Run-Time Polymorphism works according to the standard Rules.
- Hierarchical inheritance:
// C++ Program to illustrate Run-Time// Polymorphism in Hierarchical inheritance#include <iostream>usingnamespacestd;classBase1 {public:// Virtual function of Parent Classvirtualvoidfunct1(){cout <<"Base1::funct1() is called ";}virtualvoidfunct2(intx){cout <<"Base1"s Val of x:"<< x << endl;}// Non-Virtual Functionvoidfunct3(){cout <<"Base1 is the Parent class!"<< endl;}};classBase2 :publicBase1 {private:voidfunct1(){cout <<"Base2::funct1() is called ";}voidfunct2(intx){cout <<"Base2"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Base2 is the first"<<" Derived class!"<< endl;}};classBase3 :publicBase1 {private:voidfunct1(){cout <<"Base3::funct1() is called ";}voidfunct2(intx){cout <<"Base3"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Class Base3 is second"<<" Derived class!"<< endl;}};// Grand-Child_1 of Base1 classclassDerived1 :publicBase3 {private:voidfunct1(){cout <<"Derived1::funct1() is called ";}voidfunct2(intx){cout <<"Derived1 Class"s Val of x:"<< x << endl;}voidfunct3(){cout <<"Class Derived1 is Good!!"<< endl;}};// Grand-Child_2 of Base1 classclassDerived2 :publicBase3 {private:voidfunct1(){cout <<"Derived2::funct1()"<<" is called ";}voidfunct2(intx){cout <<"Derived2 Class"s Val "<<"of x:"<< x << endl;}voidfunct3(){cout <<"Class Derived2 is Good!!"<< endl;}};// Run-Time Polymorphism// in Hierarchical Inheritanceintmain(){// Base1 class"s(Parent class"s)// pointer points to Derived1 classBase1* b1ptr =newDerived1();// Run-Time Polymorphismb1ptr->funct1();Derived2 d2;// Now the Base1 class pointer// points to d2 object(Derived2 class)b1ptr = &d2;// Run-Time Polymorphismb1ptr->funct2(30);// Compile-Time Bindingb1ptr->funct3();return0;}Output:Derived1::funct1() is called Derived2 Class"s Val of x:30 Base1 is the Parent class!
Explanation: Here, the Parent is Base1 and its Grand-children are Derived1 Class and Derived2 class. Even in this case, When the Base1 Class pointer is pointed to Derived1 object or Derived2 object, due to the Virtual Functions (‘VPTR’ and ‘VTABLE’), we can apply Run-Time Polymorphism here.