zoukankan      html  css  js  c++  java
  • 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指针的索引来调用不同的函数。

  • 相关阅读:
    汇付 支付,痛苦的接入过程
    路由集合中已存在名为“ XXXX” 的路由
    博客目录
    (转载)为什么使用APP Bundle
    安卓基础:后台任务
    安卓基础:应用权限
    安卓资源的使用 二
    kotlin学习三:lambda 和内联函数
    kotlin学习二:函数
    kotlin学习一:基础语法
  • 原文地址:https://www.cnblogs.com/lovemee/p/10691800.html
Copyright © 2011-2022 走看看