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个回答

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

qq_35294383
?~~ 可是我想知道这个问题实现的原理啊,和你所理解的内容完全不相干的。,,,,
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐