C++多态之虚函数

多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。

在c++中实现多态,我需要利用基类指针可以在隐式转换下指向派生类这一特性。当我们传入不同的对象(基类或派生类)就可以发生多态

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Parent{
 6 public:
 7      void fun()
 8     {
 9         cout << "我是爸爸" << endl;
10     }
11     void test()
12     {
13         cout << "parent~~~~我是用来测试的" << endl; 
14     }
15 };
16 
17 class Son:public Parent
18 {
19 public:
20     void fun()
21     {
22         cout << "我是儿子" << endl;
23     }
24     void measurement()
25     {
26         cout << "son~~~~我是用来测试的" << endl;
27     }
28 };
29 
30 
31 void Go(Parent *p)
32 {
33     p->fun();
34 }
35 int main()
36 {
37     Parent p;
38     Son S;
39     Go(&p);
40     Go(&S);
41     system("pause");
42     return 0;
43 }

 上述代码中,void Go(Parent *p)函数就相当于领班发出的命令,Parent,Son就相当于不同的两个工人,而void fun()函数就相当于他们各自负责的工作。

运行结果:

而此时结果并不是我们所想的那样。让我们来分析一下:

p指针是指向基类的指针,所以他只能访问Parent::fun()和Parent::test()。并不能访问Son::fun()。为了解决这个问题我们必须要使用virtual关键字,在基类的将基类的void fun()函数写成虚函数,在派生类中在进行从写。这样我门就能很好的达到多态的目的。

运行结果:

在此我们已经成功的使用了多态,p指针是如何来选择到底是选择那个void fun()函数的呢?

其实在存在虚函数的类中都存在一个指向虚函数表的指针(VPTR)。在发生多态时都是根据VPTR指针的索引来调用不同的函数。

原文地址:https://www.cnblogs.com/lovemee/p/10691800.html