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

Posted kunshanpipixia

tags:

篇首语:本文由小常识网(cha138.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关键字,告诉编译器,凡是对虚函数的调用,不要立即决定调用某个函数体,而是在运行的时候再做决定。

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

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

 

以上是关于运行时多态的最终奥义:虚函数的妙用的主要内容,如果未能解决你的问题,请参考以下文章

虚函数探秘

C++ 运行时多态

在c++中虚函数和多态性是啥意思

多态性与虚函数

多态性与虚函数

多态性与虚函数