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
base b的时候自动转化了,转化成一个base。
点赞 回复 分享
发布于 2017-09-05 15:00
第一种情况是面向对象,第二种是多态,因为多态是在引用或指针才可以
点赞 回复 分享
发布于 2017-09-05 15:07
同问,Base b = der();调用的Base的虚函数,不理解啊
点赞 回复 分享
发布于 2017-09-05 15:15
base b = der();  这里先构造一个派生类对象,然后发生对象切割,初始化一个基类对象。 base *bp = new der(); bp是个基类指针,指向派生类对象。 bp调用派生类的函数只会是当该函数是虚函数的情况下才会发生吧,多态性
点赞 回复 分享
发布于 2017-09-05 15:20
如果不是通过指针或引用来调用虚函数,那么在编译的时候就会确定调用哪个函数,否则会在运行的时候根据动态类型来调用相应的函数,具体是在该动态类型对应的类的虚函数表中查找该函数地址,然后生成调用即可
点赞 回复 分享
发布于 2017-09-05 15:25
编译器在你用bp调用虚函数的那段代码处进行了转变为bp->vptr[i](bp),其中vptr为虚函数指针,加了i索引到具体调用的虚函数,在执行时动态识别bp的所指类型(为派生类类型),从而根据派生类的vptr调用相应的虚函数
点赞 回复 分享
发布于 2017-09-05 15:31
交大大佬也是转行来计算机的么
点赞 回复 分享
发布于 2017-09-05 22:45

相关推荐

01-02 00:50
三峡大学 Java
程序员牛肉:这简历一出手就离失业不远了。 作为一家公司来讲,我如果要招日常实习生,那我对实习生最基本的要求就是要能干活,毕竟你就待三四个月,谁会留心培养你? 那么除了院校之外,最重要的就是项目和实习了。没有实习的话项目就好好搞。 但是你说你这个项目吧:课程作业管理系统和TMS运输管理系统。这两个基本就和闹着玩差不多。 你作为一个想要应聘Java开发实习生的人,对后端的理解还仅仅停留在:“使用mapper和sql映射”,“使用SQL进行多表调用”,“基于MySQL简历表结构”,“基于Spring boot完成CURD操作”这种玩具上......... 找不到后端实习的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务