C++虚函数和多态性的关系【virtual】之二

来源:互联网 发布:周杰伦忘词 知乎 编辑:程序博客网 时间:2024/05/21 17:28

C++虚函数和多态性的关系【virtual】之二

 

在我上一篇的文章中,我把我对虚函数和多态性的关系发表了出来,经过这些天的思考、探讨和查资料,现在我有了更深一层的理解,现记录在此,如大家有更好的理解,也请大家不吝赐教【我上一篇博文的地址是:C++虚函数和多态性的关系【virtual】之一

在上一篇的博文中,我说:如果没有虚函数【也就是virtual声明的函数】,那么C++的多态性就无法解释了,所以说,虚函数使C++具有了多态性!

经过这些天的探讨,在此表示这句话是有点问题的。首先,多态性的有无,和虚函数没有必然的联系,我们只能说,在基类里声明虚函数,这只是多态性的表现形式。【有关虚函数的探讨,我将在后面另写一篇文章】

下面,我们要先理解多态性的概念:不同的对象收到同一消息可以进行不同的响应,产生完成不同的结果

好,下面我先上代码:

[cpp] view plaincopyprint?
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. class Base  
  5. {  
  6. public:  
  7.     virtual void test()  
  8.     {  
  9.         cout<<"Base"<<endl;  
  10.         //printf("Base\n");  
  11.     }  
  12. protected:  
  13. private:  
  14. };  
  15.   
  16. class A:public Base  
  17. {  
  18. public:  
  19.      void test()  
  20.     {  
  21.         cout<<"Base--A"<<endl;  
  22.         //__super::test();  
  23.     }  
  24. protected:  
  25. private:  
  26. };  
  27.   
  28. class B:public Base  
  29. {  
  30. public:  
  31.      void test()  
  32.     {  
  33.         cout<<"Base--B\n"<<endl;  
  34.     }  
  35. protected:  
  36. private:  
  37. };  
  38. void funcall(Base* base)  
  39. {  
  40.     base->test();  
  41. }  
  42. int main()  
  43. {  
  44.     Base* base = new Base();  
  45.     funcall(base);  //Base  
  46.   
  47.     base = new A();  
  48.     funcall(base); //A  
  49.       
  50.     base = new B();  
  51.     funcall(base); //B  
  52.     return 0;  
  53. }  

其输出的结果是:

class Base 是基类,class A 和class B继承与class Base。这三个就是不同的对象,当三个不同的对象接收到同一个消息是:test(),其做出了不同的响应,这就是函数的多态性。

其实,我感觉用现实的事物做比喻这就更加形象:不同的哺乳动物有不同的呼吸方式,但是不管怎么样,我们先把呼吸这个抽象的概念放在一个基类里面,然后我们再将其具体化,猫和狗的呼吸方式,就是两种多态性的表现。

原创粉丝点击