在内存中,一个基类类型的指针是覆盖N个单位长度的内存空间。
当其指向派生类的时候,由于派生类元素在内存中堆放是:前N个是基类的元素,N之后的是派生类的元素。
于是基类的指针就可以访问到基类也有的元素了,但是此时无法访问到派生类(就是N之后)的元素。
我们来举一个例子:
我们需要给一个人打电话,这时候我们有很多种选择,可以用功能丰富多彩的智能手机;可以用小灵通;可以用办公桌上的座机;如果能打的话,甚至我们可以用大哥大。因为我们使用的功能是电话共有的基础功能——打电话,电话是一个基类,打电话是他所具有的函数,座机是电话,智能手机是电话,小灵通是电话,大哥大也是电话。他们都“是这个电话类”,但是具体功能却不一样。如果说一个最基本的电话只有打电话的功能,他无法向智能手机那样上网冲浪,随时随地TIMI一下,也就是说,基类指针是无法调用派生类新增的函数的。
那么,关于虚函数的使用呢?
如果派生类继承了基类的虚函数并进行了添加或修改,那么将派生类对象赋给基类对象后,基类对象调用虚函数的时候执行的将是派生类的方法。
比如说,早期手机上网还没那么普遍,流量费很贵的时候,有一部手机讷机亚,他预留了一些空间,但是空间里什么都没有。还有一部手机莫拖洛那,他在出厂的时候,已经预装了一些东西,魂斗罗、祖玛、坦克大战。这个空间就相当于虚函数,讷机亚的空间里一片空白,是一个virual ReturnType space(){cout<<“啥也没有”<<endl};函数。而莫拖洛那的空间里有很多应用,是一个virual ReturnType space(){cout<<“魂斗罗”<<endl;
cout<<“祖玛”<<endl;
cout<<“坦克大战”<<endl;
};的虚函数,当莫拖洛那通过数据线或蓝牙(不记得那时候蓝牙能不能传输应用了)将他的应用拷贝到讷机亚里,讷机亚就拥有了莫拖洛那拥有的应用,可以在讷机亚上玩游戏了。
用电话的例子勉强证明一下基类指针指向派生类对象的问题,接下来我们再来证明一下派生类指针为什么不能指向基类对象的问题。
说,咱们开了一家相亲网站,网站刚一注册就有诸多嘉宾入住。我们开的是一个普普通通的男女以结婚为目的的相亲网站,自然是要区分男人女人来注册。但是由于前端小姐姐人手不够,目前还没有增加详细信息的注册要求,注册来的嘉宾同一标识类别为“人”,却没有区分男人还是女人。但是小姐姐目前做好了头像上传的功能,所以嘉宾们的头像五花八门形形色色的。
开门第一天,就有一个小伙子联系我们的工作人员:“我想找一个对象,这过年了家里催的那叫一个急啊!我妈说两年内一定要抱上乖孙,快帮帮我吧!”,于是工作人员拿出了百分百的热情对待顾客,通过“头像筛选”,最后选出了几个可爱俏皮的“头像”人选,帮助小伙子和那几个人选牵线搭桥,进行联系。
经过交流,小伙子还真就找到一个兴趣相投,非常聊得来的人选。于是小伙子迫不及待的联系工作人员:“我觉得这个‘恬淡兰花’非常对我心意!”
工作人员一听这好啊,难道咱这网站刚一开业就成了一单?于是抓紧联系了“恬淡兰花”,恰巧又与委托人在同一个城区,于是安排两人下午在浪漫北北山见面。
浪漫北北山位于城区北区北侧,因此有了北北山的名号,据说很久以前北北山有别的名字,并且山上一处石壁上还刻着他的名字,但是有天沙尘暴来袭将那石壁摧残的不像样子,不知道哪位后来者爬到石壁对面处远眺,依稀可见两个北字,又因为北北与baby谐音,于是成了情侣约会常来之处。
今日又恰逢21年3月14日,大家都说在今天来浪漫北北山,就可以“爱你一生一世”。又有攀岩高手决定在今天直播北北山攀岩,带人们不知多少年后真正的一观那刻着北北山的石壁。所以今天的北北山着实热闹,安排两人在此相亲也别有一番韵味,不愧是我们的工作人员,专业!
时间来到了下午,因为是春季,所以天气也并不炎热,阳光晴朗,小伙子按约定的时间,捧着鲜花来到了相约的地点,身边一对又一对的情侣路过让他一阵艳羡,同时越发的期待了起来“恬淡兰花”。“希望她是一个温柔、恬淡、端庄文雅、漂亮的人呢”,他想。
远处又起了一阵喧哗,小伙子朝那边一看,原来是攀岩高手在那悬崖峭壁上利用工具左右腾挪,已经到达了那刻着北北山的石壁了。
高手爬到石壁上,将自己的安全绳固定在石壁旁,石壁处刚好有一处小平台可以站住,他拿出了铲子和一些工具,同时将手机朝着石壁上的字固定好。
“各位老铁们,今天北北山的名字就将真正显现于世了!老铁们来波点赞,我这就将上面的尘土砂石都给清理了!”直播间里顿时走起了一波六六六。
小伙子正看得出神,这是一只白净的手搭在了他的肩膀上,小伙子心中一动,“是她来了?”,他惊喜的转过了头。
温柔、恬淡、温文尔雅、面带笑容、漂亮。看到眼前这人,刚刚所预想的特征都浮现了出来。
但……
“为什么是个男人啊喂??”小伙子将鲜花扔在地上,恼怒的吼道。
“兰花,四君子也。”恬淡兰花轻轻一笑,摸了摸小伙子头。“吾与君相交甚欢,不若结为好友?”
小伙子扑到恬淡兰花怀里,崩溃大哭:“可是你不会生孩子啊呜呜呜呜呜呜!我妈他揍我咋办啊呜呜呜呜呜呜”
此时,攀岩高手也终于清理完了石壁,北北二字终于清晰可见,但同时两个北字下侧又露出了一角。
“咦,这是?”高手顿时惊奇,连忙抬手继续清理下侧砂石。
砂石逐渐被清理掉,两个“月”字隐隐约约的显现了出来……
有点跑题了,容我强行解释一下。“男人”、“女人”就像是“人”的派生类。派生类除了包含基类的一部分,还包含他所派生的部分。当我们用派生类指针来指向基类对象时,就会发生越界的情况,也就是我们不知道这个“人”到底是男人还是女人,是大人还是小孩,一切都是未知的,不允许的。