• 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指针的索引来调用不同的函数。

  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/lovemee/p/10691800.html
Copyright © 2020-2023  润新知