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

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

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

  • 相关阅读:
    命令行颜色换算器(基于python)
    VPS常用操作(自用)
    自动读取虚拟币ETC行情并语音提醒的小工具(mac OSX)
    nginx最基本操作
    一个平庸程序员的自白
    unity 2d游戏 按y坐标排序子对象
    开源输入法推荐
    unity插件,从一段文字中提取中文并去重
    考试总结(CE???)
    螺旋矩阵
  • 原文地址:https://www.cnblogs.com/kunshanpipixia/p/13420056.html
Copyright © 2011-2022 走看看