?~~ 2017-04-14 14:47 采纳率: 75%
浏览 2158

C++父类指针强制转换赋给子类指针问题,求大神解答

本问题困扰我几天了,希望哪位大牛可以为我解释下。最好有内存四区的模型图!谢谢了!!!!

例如下面代码

 #include<iostream>
using namespace std;

class A
{
public:
    void fun1()
    {
        cout << "i'm  A.fun1" << endl;
    }
    virtual void fun2()
    {
        cout << "i'm  A.fun2" << endl;
    }
};

class B:public A
{
public:
    void fun1()
    {
        cout << "i'm  B.fun1" << endl;
    }
    virtual void fun2()
    {
        cout << "i'm  B.fun2" << endl;
    }

};


int main()
{
    A a;
    B *b = (B *)&a;
    b->fun1();
    b->fun2();
    system("pause");
    return 0;
}
 }

输出结果是

i'm B.fun1
i'm A.fun2

请大神解答:
1.这个结果该怎么理解
2.这个 B *b = (B *)&a;的内存模型是什么样的

我从网上查到的结论是这样的:(不理解为什么会有这个this指针)

定义一个父类对象,将该父类对象的指针强制类型转换为子类指针,并赋给一个子类指针,则:该子类指针将指向该父类对象,但是其this指针仍然是指向子类的指针。

当该指针调用虚成员函数时,将按照对象的内存布局(指向虚函数表的指针存储在该对象的前四个字节)调用父类虚成员函数。

当该指针调用普通成员函数时,将通过this指针调用位于代码段的该子类的成员函数。

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-04-14 15:37
    关注

    作为司机,必须搞清楚发动机的布局和构造才能开车么?作为家庭主妇,需要学习压缩机的原理才能使用冰箱么?
    作为程序员,我不关心什么内存的模型,我只关心怎么写程序。虚函数就是让派生类重写的,因此不管什么类型调用,它执行的一定是实际上这个实例属于的类型的那个方法。
    如果有一种语言,比如叫D++,它如果规定函数重写后,看什么类型的变量,调用什么方法,而不是对象实例本身的类型,那么它就是一种没用的语言。就好比不能输出动力的发动机和不能制冷的冰箱。我要做的是不用这种语言,还是不用关心它怎么实现的。

    评论

报告相同问题?

悬赏问题

  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿