多重继承、虚继承下的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