【转】虚函数表

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】

之前已经介绍过指针函数的概念,函数名其实就是一个变量,这样,就可以比较好的理解虚函数表的实现了,子类继承的父类两个有相同的函数名,则子类就覆盖了那个函数变量,这样调用的函数就相应的改变了.

原文地址:https://www.cnblogs.com/winslam/p/9551296.html