多态:不同对象收到相同消息时,产生不同的动作。(说通俗点就相当于,在一工地上有许多工人,每个工人负责的工作都不一样,但是他们在听到领班发出“开工”命令后,开始各自负责的工作)。
在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指针的索引来调用不同的函数。