码迷,mamicode.com
首页 > 其他好文 > 详细

运行时多态的最终奥义:虚函数的妙用

时间:2020-08-02 19:56:47      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:mes   names   namespace   com   图片   地址   方便   多态   相关   

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

技术图片

 

 

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

先放个错误输出代码:

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

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

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

 

运行时多态的最终奥义:虚函数的妙用

标签:mes   names   namespace   com   图片   地址   方便   多态   相关   

原文地址:https://www.cnblogs.com/kunshanpipixia/p/13420056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!