社区
C语言
帖子详情
Base*pBase=new drived?
liuchang2859
2002-04-04 06:17:29
加精
Base*pBase=new drived? Base 是drived的基类,继承关系。
这个式子为什么会成立?编译器和内存到底发生了什么?
申请的空间是多大?是drived那么大还是Base那么大?
...全文
194
8
打赏
收藏
Base*pBase=new drived?
Base*pBase=new drived? Base 是drived的基类,继承关系。 这个式子为什么会成立?编译器和内存到底发生了什么? 申请的空间是多大?是drived那么大还是Base那么大?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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那么大
基类的指针可以指向派生类的对象,反之不行
翻看书上关于继承及虚函数的部分
C++学习之多态
虚函数 在类的定义中,前面有 virtual 关键字的成员函数就是虚函数。 例如: class
base
{ virtual int get() ; }; int
base
::get() { } virtual 关键字只用在类定义里的函数声明中, 写函数体时不用。 多态的表现形式一 派生类的指针可以赋给基类指针。 通过基类指针调用基类和派生类中的同名虚函数时:...
通过指针访问虚函数表调用函数
环境: VS2019, Debug x86编译器 #include <stdio.h> #include <stdlib.h> #include <string.h> class
Base
{ public: virtual void func1() = 0; virtual void func2() = 0; }; class
Drive
d : public
Base
{ public: virtual void func1() { printf("Dr
c++ primer总结小点
1、关于变量的初始化:如果一个变量在全局内定义的,那么系统会保证给他提供初始值0。如果变量在局部内定义的,或是通过
new
表达式动态分配的,则系统不会向他提供初始值0。这些对象被称为未初始化的。未初始化的对象不是没有值,而是他得值是未定义的。(与它相关联的内存区中含有一个随机的位串,可能是以前使用的结果。) 因为未初始化对象是个常见的错误,而且很难发现,所以,一般建议为每个被定义的对象提供一个初始
C++类的几个概念
周四去面试,C++很长时间不用,加之C#的使用,很多基本的概念都给搞混了,根据面试的题目,看看书,写出下面的测试程序。其中包括构造函数、拷贝构造函数、析构函数、虚析构函数、动态绑定等,以注释的形式说明,不妥之处还望指正。// COO.cpp : Defines the entry point for the console application.//#include "stdaf
C/C++编程笔记:高级C++知识 | 虚拟构造器
我们可以在C ++中使类构造函数虚拟化以创建多态对象吗?不会。C++是静态类型的(RTTI的目的有所不同)语言,对于C ++编译器来说,多态创建对象是没有意义的。编译器必须知道创建对象的类类型。换句话说,从C ++编译器的角度来看,要创建哪种类型的对象是编译时的决定。如果我们将构造函数设为虚拟,则编译器会标记错误。实际上,除了inline之外,构造函数的声明中不允许其他关键字。 在实际情况下,我们需要基于一些输入在类层次结构中创建派生类对象。换句话说,对象创建和对象类型紧密耦合,这迫使修改扩展。虚拟构
C语言
70,037
社区成员
243,243
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章