虚函数的特性

来源:互联网 发布:国际经济数据 编辑:程序博客网 时间:2024/05/17 05:18
#include <iostream>using namespace std;class Base{protected:int n;public:Base (int m){n=m++; }virtual void g1(){cout<<"Base::g1()..."<<n<<endl; g4();}virtualvoid g2(){cout<<"Base::g2()..."<<++n<<endl;g3();}virtual void g3(){cout<<"Base::g3()..."<<++n<<endl; g4();}virtualvoid g4(){cout<<"Base::g4()..."<<++n<<endl;}};class Derive:public Base{int j;public:Derive(int n1,int n2):Base(n1){  j=n2;}void g1(){cout<<"Deri::g1()..."<<++n<<endl;g2();}void g3(){cout<<"Deri::g2()..."<<++n<<endl;g4();}};void main(){Derive Dobj(1,0);Base Bobj=Dobj;Bobj.g1();cout<<"------------------"<<endl;Base *bp=&Dobj;bp->g1();cout<<"------------------"<<endl;Base &bobj2=Dobj;bobj2.g1();cout<<"------------------"<<endl;Dobj.g1();}

输出的结果如上。

我们需要对每一个代码进行分析

(1)

Derive Dobj(1,0);                   //L1Base Bobj=Dobj;                     //L2<pre name="code" class="cpp">Bobj.g1();                          //L3

          L1 创建一个Derive类的对象Dobj,并通过构造函数,对其赋值。L2创建一个Base类的对象Bobj,并将Dobj赋值给Bobj,因为这其中涉及到了基类对象和派生类对象赋值之间的问题,派生类对象赋值给基类对象,只会把基类部分的值赋给基类对象,也就是说由派生类自己定义的成员是无法赋值到基类对象中。因此就不能解释L3的结果了,当调用g1()时,并没有调用到Derive中的g1(),而是基类中的g1().


(2)

Base *bp=&Dobj;                //L1bp->g1();                      //L2
                   L1创建一个Base类的名为bp指针,并指向Dobj的地址。通过bp指针调用g1()函数,根据通过基类对象的指针和引用访问派生类对象的虚函数时,会体现虚函数的特性。调用g1()时,实际上就是调用Derive中的g1(),并输出结果。输出结果后,g1()函数后继续调用g2(),因为Derive中并没有g2()函数,因此会自动调用Base中的g2(),输出结果,继续调用g2()中的g3()。注意:派生类通过从基类继承的成员函数调用虚函数时,将访问到派生类中的版本,例子如下:

#include<iostream>using namespace std;class B{public: void f(){g();} virtual void g(){cout<<"B::g";}};class D:public B{public:void g(){cout<<"D::g";}};void main(){D d;d.f();}

因此将调用Derive中的g3(),输出并继续调用Base中的g4();

后面的调用如上~~~

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 冰箱电脑板坏了怎么办 笔记本网线接口坏了怎么办 蓝p吃了一片 怎么办 sd卡上锁了忘记密码怎么办 手机sd卡被锁定怎么办 冰箱制冷管堵了怎么办 冰箱的管子破了怎么办 淘宝京东e卡冻结怎么办 苏宁任性付冻结怎么办 苏宁订单删除了怎么办 联通销户话费有余额怎么办 暖气改地热不热怎么办 老楼房暖气不热怎么办 4s店修不好车怎么办 苏宁的发票丢了怎么办 京东退货没有发票怎么办 发票发错了邮箱怎么办 苹果手机忘记电子邮箱验证码怎么办 退差价把红包退还了怎么办 网上购票票丢了怎么办 岗位人手不够老板又不招人来怎么办 辞职后提成不发怎么办 老板给客户吵架员工该怎么办 冰柜声音大怎么办嗡嗡响 交了钱电没有怎么办 小白熊电动吸奶器显示F1怎么办 花洒的水变小了怎么办 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办