C++的特性之一就是多态,多态的特性就是通过虚函数来实现的,而虚函数就是通过一个虚函数表来实现的。(关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。)
1 #include <iostream> 2 using namespace std; 3 4 class Base1 { 5 public: 6 virtual void f() { cout << "Base1::f" << endl; } 7 virtual void g() { cout << "Base1::g" << endl; } 8 virtual void h() { cout << "Base1::h" << endl; } 9 10 }; 11 12 class Base2 { 13 public: 14 virtual void f() { cout << "Base2::f" << endl; } 15 virtual void g() { cout << "Base2::g" << endl; } 16 virtual void h() { cout << "Base2::h" << endl; } 17 }; 18 19 class Base3 { 20 public: 21 virtual void f() { cout << "Base3::f" << endl; } 22 virtual void g() { cout << "Base3::g" << endl; } 23 virtual void h() { cout << "Base3::h" << endl; } 24 }; 25 26 27 class Derive : public Base1, public Base2, public Base3 { 28 public: 29 virtual void f() { cout << "Derive::f" << endl; } 30 virtual void g1() { cout << "Derive::g1" << endl; } 31 }; 32 33 34 typedef void(*Fun)(void); 35 36 int main() 37 { 38 Base1 temp1; 39 Base2 temp2; 40 Base3 temp3; 41 42 Derive d; 43 return 0; 44 }
【如图:下面三面黄框,是父类的虚函数表,基类中仅继承了同名函数f(); 所以基类中f()函数覆盖了3个父类的同名函数,你看图,值都不一样,那要如何调用才能调用不同父类的f()函数,和子类本身的f()函数???
1 Derive d; 2 d.f(); 3 d.Base1::f(); 4 d.Base2::f(); 5 d.Base3::f();
对象.父类名::函数名();
参见我的博客: https://www.cnblogs.com/winslam/articles/9296594.html】
之前已经介绍过指针函数的概念,函数名其实就是一个变量,这样,就可以比较好的理解虚函数表的实现了,子类继承的父类两个有相同的函数名,则子类就覆盖了那个函数变量,这样调用的函数就相应的改变了.