Base*pBase=new drived?

liuchang2859 2002-04-04 06:17:29
加精
Base*pBase=new drived? Base 是drived的基类,继承关系。
这个式子为什么会成立?编译器和内存到底发生了什么?
申请的空间是多大?是drived那么大还是Base那么大?

...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
潘李亮 2002-04-08
  • 打赏
  • 举报
回复
这是C++的多太的一种机制
aileen_long 2002-04-08
  • 打赏
  • 举报
回复
所有指针(不论类型)的大小当然都一样。俺上面说的是指移动的字节数。
int *pnData; char *pchData;
pnData++ // 指针在内存空间移动了4个字节(对于32位系统)
pchData++ // 移动了一个字节
就你的题目而言,sizeof(Base)和sizeof(drived)按照常理应该是不一样的,那么对于内存中连续存放的若干个drived对象,如果按Base的大小去移动指针访问某个drived对象,显然要出错!
johnhowl 2002-04-05
  • 打赏
  • 举报
回复
这样写的主要目的是为了多态性,其实对象一般存在于堆内存中,主要由各成员变量和一个指向所谓虚函数表的指针构成,编译器根据类声明中各虚函数声明顺序组成一张虚函数表,并加上一个成员变量指针指向虚函数表,在继承的类中,如果出现父类有的虚函数,则虚函数表中对应的这个虚函数指针被改写,所以当一个父类的指针指向子类的对象时,如果调用虚函数,则根据编译器加上的指向虚函数表的那个成员指针,它能自动调用各自的虚函数。
当然你写的这种情况,继承类中有但父类没有的成员变量,就不能调用了。
coppermine 2002-04-05
  • 打赏
  • 举报
回复
严格的说,这种写法只有在"通过公有继承的方式"产生派生类的情况下成立.
在公有继承下,子类和基类是"is a"的关系.protected和private继承是实现继承,这样写编译器会报错。至于对象的内存布局以及以基类指针指向派生类对象时编译器进行了怎样的转换,可以参考《inside c++ object model》
liuchang2859 2002-04-04
  • 打赏
  • 举报
回复
指针类型,是指base* 和drived*么
他们大小不一样么,指针不都是地址值么?应该是32位吗?
再麻烦解释一下?
aileen_long 2002-04-04
  • 打赏
  • 举报
回复
不仅仅基类与派生类可以这样写,基本上,只要加上强制转换,任何两个类都可以这样写。题目的等式也可以写成:drived *pdrived = (drived*)new Base;
只不过这样写没有任何意义,因为对程序只有坏处没有好处。
但即使是基类和派生类有这样特殊的关系,也要小心运用,假如这样分配一段空间:
Base *pBase = new drived[10];
你就不能通过pBase[2]这样的形式去访问drived的对象。因为指针的增减无论何种情况都是通过指针类型的大小在内存空间移动的,而不是依据它所指向的对象。Base和drived的大小显然不会一样。
之所以这样写,让基类的指针指向派生类的对象,是为了实现多态。
zhjackal 2002-04-04
  • 打赏
  • 举报
回复
创建了一个derived对象。在调用operator new的时候,编译器会自动添加一个size_t的参数,在用Base *pBase = new Derived;的时候,该参数为sizeof(Derived)。然后再调用Derived的构造函数,构造一个Derived对象。
alexzhou 2002-04-04
  • 打赏
  • 举报
回复
是创建了一个drived对象
是drived那么大
基类的指针可以指向派生类的对象,反之不行
翻看书上关于继承及虚函数的部分

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧