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

相关推荐

点赞 评论 收藏
分享
10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务