cpp多态,父类指针接收子类对象指针怎么理解? 200

死记硬背效果不好,请从内存上讲解下,先谢了... 死记硬背效果不好,请从内存上讲解下,先谢了 展开
 我来答
jackwind1987
2013-01-23 · TA获得超过2738个赞
知道大有可为答主
回答量:1268
采纳率:50%
帮助的人:496万
展开全部
从概念上讲,父类指针指向之类对象是“是一个”的概念,就是说一个子类的对象也可以称为是一个父类的对象。比如一只猫也可以称为一只动物。
从内存上讲,分两种情况,如果父类不含有虚函数和含有虚函数
如果没有虚函数,那么情况很简单,子类的对象的开头部分含有父类对象的数据,也可以当做子类对象包含了一个父类对象。比如说一个父类具有两个int,继承自它的子类又定义了两个double,那么子类的内存分布是先有两个int再有两个double。这时,函数的调用的原理是简单的根据指针的类型寻找函数的地址偏移,也就是说按照父类的类定义查找函数的地址再执行,没有多态的效果。
如果有虚函数,那么父类和继承它的子类的对象内存开头都会有一个虚函数指针。然后才是像没有虚函数的时候那样的内存分布。有了这个虚函数指针,调用函数时就不再根据指针的类型来查找函数的地址,而是根据指向的对象的中的虚函数指针来查找函数的地址,由于这个虚函数指针存在于对象的内存内部,所以调用的函数是子类的版本还是父类的版本是有对象本身决定的而不是由指针的类型决定的,于是就有了多态的效果。
马云飞cool
2013-02-02 · TA获得超过106个赞
知道答主
回答量:129
采纳率:0%
帮助的人:94万
展开全部
这个很简单,就说说共有继承吧。
1,老爸有间房子,有一串钥匙,房间里有一台纯平15寸黑白电视机。需要钥匙打开门才可以看电视。(电视是可虚拟重载函数)
2,后来老爸有了儿子,儿子继承老爸的财产,所以老爸给自己配了自己房间的钥匙,可以看黑白电视机。
3,为了不距离老爸太远,儿子同时在老爸房子旁边修了一间房子,这间房子有一串钥匙,房间有一台35寸彩色电视机。(对象内存连续)。
这样结果是:儿子就有两串钥匙(老爸的和自己的)。儿子想看电视,当然是优先看35寸彩色的咯(谁想看15寸小黑白呢)。(看35寸电视,意思是先访问子类虚拟重载函数)
父类指针接收子类对象指针的意思就是:儿子把自己房间钥匙给老爸了。
老爸和儿子房间修一起:意思就是内存对象中,儿子看来两间房(老爸和儿子)是内存连续的。
对老爸而言,他只有自己的钥匙。就内存对象中,老爸只能看自己房间的15寸电视。除非给老爸一串儿子房间的电视。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
精_灵_小_夔
2013-01-23 · TA获得超过124个赞
知道小有建树答主
回答量:408
采纳率:0%
帮助的人:332万
展开全部
推荐看《深度探索c++对象模型》这本书,可以找到你想要的完整的答案,但要有些基础才能看得懂。
我简单解释一下吧。
class Base{int a;}
class Derived : public Base{int b;}
Base *pd = new Derived;
你想理解的就是最后一句是什么是吧?先假设这一句是运行期绑定的(因为这里比较特殊,编译器会在编译期做优化,实质是编译期就绑定了),基类指针pd会指向一个为Derived分配的内存空间。这个内存空间分两部分,前面存储基类的数据,后面存储派生类的数据。
但是,若扩展到多态,即Base里有virtual函数,就会多出一个vptr,即指向vtbl(virtual table)的指针,同时Deraived类也有一个vptr。
另外还要考虑的情况还有多重继承、虚继承等情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
beddy1
2013-01-23 · TA获得超过1989个赞
知道大有可为答主
回答量:2271
采纳率:0%
帮助的人:2214万
展开全部
先做如下三个类假设
class A {}
class B : public A {}
class C : public B {}

若某函数 定义为 fun(A * pa);

你完全可以这样调用它,B b; fun(&b);

从逻辑上很好理解,因为类B、类C的实例是可以看作类A的实例的。
从内存上看,形如
A --------
B --------+++++++
C --------+++++++~~~~~~~

- 记号表示类A的成员,+ 表示类B的成员,~表示类C的成员。示意各类占用的内存情况,可以很明显的看出来,类C的前部存放的是类B的内容,而类B的前部存放的是类A的内容。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式