运行时多态的最终奥义:虚函数的妙用
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关键字,告诉编译器,凡是对虚函数的调用,不要立即决定调用某个函数体,而是在运行的时候再做决定。
我的个人看法是:每换一个派生类,派生类相关的虚基类指针偏移量便不同,这样便得以实现了虚函数调用了不同的函数体,从而形成了运行时的多态。
个人看法有可能不准确,还请路过大佬多多指点。
以上是关于运行时多态的最终奥义:虚函数的妙用的主要内容,如果未能解决你的问题,请参考以下文章