VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 404|回复: 9

为什么在调用父类虚函数

[复制链接]
06_avatar_middle
最佳答案
0 
在线会员 发表于 2021-7-11 19:32:29 | 显示全部楼层 |阅读模式
#include <iostream>
using namespace std;

class X {
public:
    int k;
    X():k(12){
    }

    void fun(){
        cout<<"x class::fun k="<<k<<endl;
    }

    virtual void get1() {
        cout<<"父类 get"<<endl;
    }

};

class Y :public X{
public:
    Y():X(){
        cout<<"Y 构造函数"<<endl;
    };
    virtual void get1() {
        cout<<"子类 get"<<endl;
    }

};

int main() {
    X x;
    Y* py=(Y*)&x;
    py->fun();
    py->k;
    py->get1();     //为什么这里会调用父类的get1,而不是子类的get1
    return 0;
}






上一篇:关于动态定义数组
下一篇:关于视频播放HTML5和FLASH两种方式的问题
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-7-12 00:44:07 | 显示全部楼层
本帖最后由 cpp2019 于 2021-7-12 00:46 编辑

子类指针指向父类的实例?不明白你这么写有什么的特殊意义!
  1.         Y* py = new Y();
  2.         py->fun();
  3.         py->k;
  4.         py->get1();
复制代码

为什么在调用父类虚函数
70_avatar_middle
最佳答案
49 
在线会员 发表于 2021-7-12 08:34:55 | 显示全部楼层
多态的实现时基于 虚函数表的,调用哪个类的函数,在你new对象的时候就已经确定了。
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-12 10:07:47 | 显示全部楼层
cpp2019 发表于 2021-7-12 00:44
子类指针指向父类的实例?不明白你这么写有什么的特殊意义!

看到有人说,面试时碰到过这种题
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-12 10:13:09 | 显示全部楼层
cpp2019 发表于 2021-7-12 00:44
子类指针指向父类的实例?不明白你这么写有什么的特殊意义!

你最后怎么会显示子类get,我在vs2013和gcc中都是显示调用是父类的虚函数get
为什么在调用父类虚函数

为什么在调用父类虚函数
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-12 10:15:44 | 显示全部楼层
tony666 发表于 2021-7-12 08:34
多态的实现时基于 虚函数表的,调用哪个类的函数,在你new对象的时候就已经确定了。

没有new啊 ,看有别人发的面试题,试下 按理解是应该调用子类虚函数get ,可结果反而调用父类虚函数
17_avatar_middle
最佳答案
2 
在线会员 发表于 2021-7-12 11:24:54 | 显示全部楼层
可以简单的理解:

  Y* py=(Y*)&x; //取地址时取的x.get1();比如是:0x1111 的地址,此时已经固定了函数的地址了,你强转也那个0x1111也是不会变的啊。
31_avatar_middle
最佳答案
49 
在线会员 发表于 2021-7-12 12:50:29 | 显示全部楼层
这下应该能够明白吧
为什么在调用父类虚函数
  1. #include <iostream>
  2. using namespace std;

  3. class X
  4. {
  5. public:
  6.         int k;
  7.         X() :k(12) {
  8.         }

  9.         void fun() {
  10.                 cout << "x class::fun k=" << k << endl;
  11.         }

  12.         virtual void get1() {
  13.                 cout << "父类 get" << endl;
  14.         }

  15. };

  16. class Y :public X
  17. {
  18. public:
  19.         Y() :X() {
  20.                 cout << "Y 构造函数" << endl;
  21.         };
  22.         virtual void get1() {
  23.                 cout << "子类 get" << endl;
  24.         }

  25. };

  26. int main()
  27. {
  28.         Y objY;
  29.         Y* pObjY1 = (Y*)&objY;
  30.         pObjY1->fun();
  31.         pObjY1->k;
  32.         pObjY1->get1();
  33.         cout << "--------华丽的分割符--------" << endl;

  34.         Y* pObjY = new Y;
  35.         pObjY->fun();
  36.         pObjY->k;
  37.         pObjY->get1();
  38.         delete pObjY;
  39.         cout << "--------华丽的分割符--------" << endl;

  40.         Y objY2;
  41.         objY2.fun();
  42.         objY2.k;
  43.         objY2.get1();
  44.         cout << "--------华丽的分割符--------" << endl;

  45.         cout << "\n这个py完全就是父类X的实例,跟子类Y没半点儿关系!" << endl;
  46.         cout << "上边三个都是子类Y,可以看到Y的构造函数输出\n" << endl;
  47.         X x;
  48.         Y* py = (Y*)&x;
  49.         py->fun();
  50.         py->k;
  51.         py->get1();

  52.         return 0;
  53. }
复制代码
06_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-7-13 10:29:37 | 显示全部楼层
好吧,谢谢各位
97_avatar_middle
最佳答案
0 
在线会员 发表于 2021-7-23 17:01:40 | 显示全部楼层
用派生类的指针指向父类的对象,这么做是不合理的啊。为什么在调用父类虚函数
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-10-23 17:21

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表