c++一个小问题

有一个小问题,在c++里,有一个基类base,和一个子类der。我现在声明一个base b = der(); 和一个 base *bp = new der();。那b和bp的区别在哪里?用b来调用函数时,只能调用父类base的函数,而bp可以调用子类重写的函数,这是为什么?
全部评论
base b=der()的执行过程是这样的:1、构造一个栈上的der临时对象2、调用base的拷贝构造函数,将der对象作为参数传入,此时der对象会隐式转化为base对象3、base对象构造完,der临时对象销毁最终结果就是构造了一个栈上的base对象,你用b肯定只能调用base的函数;base *bp=new der()的执行过程是这样的:1、在堆上构造一个der对象2、bp指针指向这个对象这种情况下,bp的静态类型是base,但是动态类型是der,因此会触发虚函数机制,调用der的虚函数实现
点赞 回复 分享
发布于 2017-09-05 15:19
如果需要调用子类重写的函数(必须是虚函数)必须以指针或引用的方式调用;
点赞 回复 分享
发布于 2017-09-05 15:50
交大大佬也是转行来计算机的么
点赞 回复 分享
发布于 2017-09-05 22:45
编译器在你用bp调用虚函数的那段代码处进行了转变为bp->vptr[i](bp),其中vptr为虚函数指针,加了i索引到具体调用的虚函数,在执行时动态识别bp的所指类型(为派生类类型),从而根据派生类的vptr调用相应的虚函数
点赞 回复 分享
发布于 2017-09-05 15:31
如果不是通过指针或引用来调用虚函数,那么在编译的时候就会确定调用哪个函数,否则会在运行的时候根据动态类型来调用相应的函数,具体是在该动态类型对应的类的虚函数表中查找该函数地址,然后生成调用即可
点赞 回复 分享
发布于 2017-09-05 15:25
base b = der();  这里先构造一个派生类对象,然后发生对象切割,初始化一个基类对象。 base *bp = new der(); bp是个基类指针,指向派生类对象。 bp调用派生类的函数只会是当该函数是虚函数的情况下才会发生吧,多态性
点赞 回复 分享
发布于 2017-09-05 15:20
同问,Base b = der();调用的Base的虚函数,不理解啊
点赞 回复 分享
发布于 2017-09-05 15:15
第一种情况是面向对象,第二种是多态,因为多态是在引用或指针才可以
点赞 回复 分享
发布于 2017-09-05 15:07
base b的时候自动转化了,转化成一个base。
点赞 回复 分享
发布于 2017-09-05 15:00

相关推荐

07-30 11:52
门头沟学院 Java
美团暑期实习没投递成功,这次正式批的北斗计划总该有我的一部分了吧!
求职的纳鲁多:大佬投我就不投了,毕竟王不见王,避你锋芒
点赞 评论 收藏
分享
06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务