首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
在线笔面试、雇主品牌宣传
登录
/
注册
MatthewMatt
2017-06-21 23:06
家里蹲大学 C++
关注
已关注
取消关注
请教下一个小问题,C++派生类都会包含基类对象成员吗?
详细补充下:无论派生类是已何种方式继承基类,包括public protected private,基类对象成员也可以是public protected private,我想问无论派生类以哪种方式继承基类,是不是在内存中派生类都会含有基类对象成员,哪怕派生类无法访问?
今天突然想到的一个小问题,求大神告知。
提示
全部评论
推荐
最新
楼层
Joran_02
浙江万里学院 C++
在C++编译器的内部 类可以理解为结构体 子类是由父类成员叠加子类新成员得到的 C++多态实现原理:
点赞
回复
分享
发布于 2017-06-22 07:49
harry502
重庆邮电大学 C++
是的...
点赞
回复
分享
发布于 2017-06-21 23:35
艾德
福建工程学院 C++
应该吧,举个例子。父类指针指向子类对象,父类指针可以访问private继承的子类对象中属于父类部分的成员,所以内存应该存在
点赞
回复
分享
发布于 2017-06-22 00:26
JEWELCCLi
腾讯_测试开发
存在,最直接的例子就是多态机制中的虚函数表,可以百度下陈皓大神的那个blog,那个经典啊,有图有理,直观明了
点赞
回复
分享
发布于 2017-06-22 07:10
Joran_02
浙江万里学院 C++
会包含。我给你一个C实现c++多态和继承的例子
点赞
回复
分享
发布于 2017-06-22 07:37
Joran_02
浙江万里学院 C++
test.h #ifndef _TEST_H_ #define _TEST_H_ typedef void Demo; typedef void Derived; Demo* Demo_Create(int i, int j); int Demo_GetI(Demo* pThis); int Demo_GetJ(Demo* pThis); int Demo_Add(Demo* pThis, int value); void Demo_Free(Demo* pThis); Derived* Derived_Create(int i, int j, int k); int Derived_GetK(Derived* pThis); int Derived_Add(Derived* pThis, int value); #endif test.c #include "test.h" #include "malloc.h" static int Demo_Virtual_Add(Demo* pThis, int value); static int Derived_Virtual_Add(Demo* pThis, int value); struct VTable // 2. 定义虚函数表数据结构 { int (*pAdd)(void*, int); // 3. 虚函数表里面存储什么??? }; struct ClassDemo { struct VTable* vptr; // 1. 定义虚函数表指针 ==》 虚函数表指针类型??? int mi; int mj; }; struct ClassDerived { struct ClassDemo d; int mk; }; static struct VTable g_Demo_vtbl = { Demo_Virtual_Add }; static struct VTable g_Derived_vtbl = { Derived_Virtual_Add }; Demo* Demo_Create(int i, int j) { struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo)); if( ret != NULL ) { ret->vptr = &g_Demo_vtbl; // 4. 关联对象和虚函数表 ret->mi = i; ret->mj = j; } return ret; } int Demo_GetI(Demo* pThis) { struct ClassDemo* obj = (struct ClassDemo*)pThis; return obj->mi; } int Demo_GetJ(Demo* pThis) { struct ClassDemo* obj = (struct ClassDemo*)pThis; return obj->mj; } // 6. 定义虚函数表中指针所指向的具体函数 static int Demo_Virtual_Add(Demo* pThis, int value) { struct ClassDemo* obj = (struct ClassDemo*)pThis; return obj->mi + obj->mj + value; } // 5. 分析具体的虚函数!!!! int Demo_Add(Demo* pThis, int value) { struct ClassDemo* obj = (struct ClassDemo*)pThis; return obj->vptr->pAdd(pThis, value); } void Demo_Free(Demo* pThis) { free(pThis); } Derived* Derived_Create(int i, int j, int k) { struct ClassDerived* ret = (struct ClassDerived*)malloc(sizeof(struct ClassDerived)); if( ret != NULL ) { ret->d.vptr = &g_Derived_vtbl; ret->d.mi = i; ret->d.mj = j; ret->mk = k; } return ret; } int Derived_GetK(Derived* pThis) { struct ClassDerived* obj = (struct ClassDerived*)pThis; return obj->mk; } static int Derived_Virtual_Add(Demo* pThis, int value) { struct ClassDerived* obj = (struct ClassDerived*)pThis; return obj->mk + value; } int Derived_Add(Derived* pThis, int value) { struct ClassDerived* obj = (struct ClassDerived*)pThis; return obj->d.vptr->pAdd(pThis, value); } Main.c #include "stdio.h" #include "test.h" void run(Demo* p, int v) { int r = Demo_Add(p, v); printf("r = %d\n", r); } int main() { Demo* pb = Demo_Create(1, 2); Derived* pd = Derived_Create(1, 22, 333); printf("pb->add(3) = %d\n", Demo_Add(pb, 3)); printf("pd->add(3) = %d\n", Derived_Add(pd, 3)); run(pb, 3); run(pd, 3); Demo_Free(pb); Demo_Free(pd); return 0; }
点赞
回复
分享
发布于 2017-06-22 07:42
MatthewMatt
楼主
家里蹲大学 C++
感谢各位大佬的回复。我在C++ primer 5th p534里有看到这么一句话“一个基类的对象可能是派生类对象的一部分,也可能不是”,请问下这句话是什么意思呢?我没有搞太懂,是不是和前面所表述的意思不一样?
点赞
回复
分享
发布于 2017-06-22 09:49
Joran_02
浙江万里学院 C++
写的太概念性了吧,愿意应该是,基类的对象可以独立存在,独立存在的话,那就不是派生类对象的一部分了---这就是那个可能不是。
点赞
回复
分享
发布于 2017-06-24 19:46
Joran_02
浙江万里学院 C++
我去翻了下,根据上下文理解。就是这个意思
点赞
回复
分享
发布于 2017-06-24 19:52
Joran_02
浙江万里学院 C++
然后书上举了两个 指针转换的例子。你动手写一写
点赞
回复
分享
发布于 2017-06-24 19:54
还没有回复哦~
相关推荐
11-23 11:26
门头沟学院 Java
杭州趣链科技面经
11月6日投递java后端开发一面:11月11日通知面试,11月14一面忘记录屏了,问的挺多的(对着项目问),想到多少写多少1.自我介绍2.说一说Spring ioc和aop3.@AutoWire和@Resource区别4.依赖注入的方式有几种5.Bean的生命周期6.Bean的作用域7.Spring用到的设计模式(答不完全)8.说一说spring的单例模式9.SpringBoot的注解10.Spring、springMvc以及SpringBoot区别11.SprinBoot的启动方式有几种(没答出来)12.项目中用到的设计模式(她想听工厂模式,我说的策略)13.项目中异常的处理14.Myba...
查看40道真题和解析
牛客创作赏金赛
软件开发笔面经
点赞
评论
收藏
分享
11-23 14:55
小红书_社区技术部_前端开发(实习员工)
9.24古茗一面
今年没想到卷成这样,面试表现挺好的,但是问多久出结果,说是候选人特别多,可能要很久,然后就一直没给后续,估计是进池子了。自我介绍如何了解到的我们公司心动的复杂权限场景以及性能优化,按钮权限,菜单权限,接口权限都是怎么实现的ci/cd是什么大文件的分片上传怎么实现的如何保证每一片的完整性文件传输某一片失败的该怎么办为什么这样子设计介绍一下promisetry catch能否监听到promise的错误,为什么promise.race的特点promise还有什么方法hash路由与history路由的区别为什么history需要服务端配置入口地址小程序开发的了解前端浏览器缓存mvc和mvvm是什么什么...
查看26道真题和解析
面经烤面筋
点赞
评论
收藏
分享
11-27 11:29
小红书_社区技术部_前端开发(实习员工)
10.30字节一面
【再再再再再再再战字节,摆烂了,这次一面都没过(手撕做出来了前面还有几轮字节面试忘记录音了,就不记录了。1.自我介绍2.主要技术栈是3.是否了解react4.做题【建议下次做这种题目拿个草稿纸!!】 console.log('start'); setTimeout(() => { console.log('children2'); setTimeout(function() { console.log('children8'); }, 0) ; Promise.resolve().then(() => { console.log('chil...
查看16道真题和解析
面经烤面筋
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
1
...
到了新公司,不要用力过猛
2.4W
2
...
校招两方/三方违约模板
1.3W
3
...
【发帖有奖💰】爆料秋招开奖进展❗
1.3W
4
...
万字长文讲透金融科技方向的就业机会
1.2W
5
...
从露宿街头到百万级种子轮融资②——我的实习期都经历了什么
1.1W
6
...
听学长的没错
7522
7
...
秋招圆满结束!!
7214
8
...
华为开奖?
6211
9
...
同事在会议室扇了自己好几个大嘴巴子
6069
10
...
华为开奖,详细时间线
5807
正在热议
#
拼多多求职进展汇总
#
231929次浏览
2026人参与
#
在职场上,你最讨厌什么样的同事
#
5629次浏览
81人参与
#
北方华创开奖
#
65786次浏览
546人参与
#
25届秋招总结
#
393332次浏览
3941人参与
#
哪些公司校招卡第一学历
#
32602次浏览
102人参与
#
地方国企笔面经互助
#
6443次浏览
16人参与
#
阿里云管培生offer
#
58041次浏览
1741人参与
#
ai智能作图
#
19970次浏览
244人参与
#
硬件兄弟们 甩出你的华为奖状
#
77815次浏览
625人参与
#
实习,投递多份简历没人回复怎么办
#
2434516次浏览
34698人参与
#
工作中,你有没有遇到非常爱骂人的领导?
#
4648次浏览
47人参与
#
实习与准备秋招该如何平衡
#
722299次浏览
8550人参与
#
我的实习求职记录
#
6118074次浏览
83935人参与
#
如果再来一次,你还会选择这个工作吗?
#
109094次浏览
1094人参与
#
签了三方后想毁约怎么办
#
18484次浏览
111人参与
#
25届机械人为了秋招做了哪些准备?
#
24868次浏览
355人参与
#
如果你有一天可以担任公司的CEO,你会做哪三件事?
#
9799次浏览
206人参与
#
游戏求职进展汇总
#
52582次浏览
343人参与
#
夸夸我的求职搭子
#
131933次浏览
1360人参与
#
机械求职避坑tips
#
22025次浏览
240人参与
#
腾讯求职进展汇总
#
207237次浏览
1694人参与
#
实习想申请秋招offer,能不能argue薪资
#
35708次浏览
308人参与
牛客网
牛客企业服务