zoukankan      html  css  js  c++  java
  • 运行时多态的最终奥义:虚函数的妙用

    为了方便理解,先做如下比喻:

    我要写这么个函数:创建个“爷爷”,“爸爸”,“我”三个类型,分别定义各自一个对象,三个对象重载到一个“输出年龄”函数上,输出各自的年龄。

    先放个错误输出代码:

    #include<iostream>
    using namespace std;
    class Yeye
    {
    public:
        void nianling()const
        {
            cout << "爷爷年龄80" << endl;
        }
    };
    class Baba :public Yeye
    {
    public:
        void nianling() const
        {
            cout << "爸爸年龄53" << endl;
        }
    };
    class Wo:public Baba
    {
    public:
        void nianling() const
        {
            cout << "我的年龄26" << endl;
        }
    };
    void shuchunianling(Yeye* ptr)
    {
         ptr->nianling();
    }
    int main()
    {
        Yeye yeye;
        Baba baba;
        Wo wo;
        shuchunianling(&yeye);
        shuchunianling(&baba);
        shuchunianling(&wo);
        return 0;
    }

    得到输出如下:

     这就奇怪了,我在输出年龄函数里明明传入的是爷爷对象地址,爸爸对象地址,我对象地址,为什么输出还只是爷爷的年龄呢?

    那么接下来,在爷爷这个类中,加入一个 virtual关键字,问题就解决了。如下图处,加一个virtual关键字。

     最终代码如下:

    #include<iostream>
    using namespace std;
    class Yeye
    {
    public:
        virtual void nianling()const
        {
            cout << "爷爷年龄80" << endl;
        }
    };
    class Baba :public Yeye
    {
    public:
        void nianling() const
        {
            cout << "爸爸年龄53" << endl;
        }
    };
    class Wo:public Baba
    {
    public:
        void nianling() const
        {
            cout << "我的年龄26" << endl;
        }
    };
    void shuchunianling(Yeye* ptr)
    {
         ptr->nianling();
    }
    int main()
    {
        Yeye yeye;
        Baba baba;
        Wo wo;
        shuchunianling(&yeye);
        shuchunianling(&baba);
        shuchunianling(&wo);
        return 0;
    }

    最终输出如下:

    virtual关键字,告诉编译器,凡是对虚函数的调用,不要立即决定调用某个函数体,而是在运行的时候再做决定。

    我的个人看法是:每换一个派生类,派生类相关的虚基类指针偏移量便不同,这样便得以实现了虚函数调用了不同的函数体,从而形成了运行时的多态。

    个人看法有可能不准确,还请路过大佬多多指点。

  • 相关阅读:
    sign in和sign up区别
    sql语句左右表连接理解
    神器
    js不能执行的几个小白错误
    关于isset使用产生Can't use function return value in write context错误
    jQuery中怎么添加innerText、innerHtml(转)
    C#开发BHO程序(引)
    C# 开发BHO插件
    JS对日期时间的操作
    解决JQuery中datatables设置隐藏显示列多次提交后台刷新数据的问题
  • 原文地址:https://www.cnblogs.com/kunshanpipixia/p/13420056.html
Copyright © 2011-2022 走看看