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

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++,它如果规定函数重写后,看什么类型的变量,调用什么方法,而不是对象实例本身的类型,那么它就是一种没用的语言。就好比不能输出动力的发动机和不能制冷的冰箱。我要做的是不用这种语言,还是不用关心它怎么实现的。

    打赏 评论

相关推荐 更多相似问题