多重继承、虚继承下的this指针偏移

#include <iostream>

using namespace std;

class A
{
public:
    A() { cout << "A::this = " << this << endl; };
    /*virtual*/ ~A() {}     // virtual 1

public:
    int a;
};

class B : /*virtual */public A       // virtual 2
{
public:
    B() { cout << "B::this = " << this << endl; };
    ~B() {}

public:
    int b;
};

class C : /*virtual */public A       // virtual 2
{
public:
    C() { cout << "C::this = " << this << endl; }
    ~C() {}

public:
    int c;
};

class D : public B, public C
{
public:
    D() { cout << "D::this = " << this << endl; }
    ~D() {}

public:
    int d;
};

int main()
{
    /*
    ** 这里可以看出this发生了一定的偏移
    ** 分别去掉virtual 1和virtual 2的注释,偏移会发生什么变化?
    */
    D * p = new D();
    delete p;

    cout << "*************" << endl;

    /*
    ** static_cast转换,会和派生类的this指针相等
    ** 强制转换呢?
    ** 可以转换成(A *)?
    */
    B * pB = static_cast<B *>(p); //(B *)p;
    cout << pB << endl;

    C * pC = static_cast<C *>(p); //(C *)p;
    cout << pC << endl;

    //A * pA = static_cast<A *>(p);
    //cout << pA << endl;

    return 0;
}

     本人机子(XP+VS2008)上,运行结果为:

    调试状态下,可以看到D的内存结构,不妨以此来理解this指针的偏移。

参考资料:

1.http://hi.baidu.com/jsunhj/blog/item/83b51c510778537584352404.html

posted @ 2012-05-29 17:11  木愚  阅读(642)  评论(0编辑  收藏  举报