虚指针的初始化

#include <iostream>

using namespace std;

class Base {
public:
    Base() {
        cout << "In Base" << endl;
        cout << "Virtual Pointer = " << (int*)this << endl;
        cout << "Address of Vtable = " << (int*)*(int*)this << endl;
        cout << "Value at Vtable = " << (int*)*(int*)*(int*)this << endl;
        cout << endl;
    }
    virtual void f1() { cout << "Base::f1" << endl; }
};

class Drive : public Base {
public:
    Drive() {
        cout << "In Drive" << endl;
        cout << "Virtual Pointer = " << (int*)this << endl;
        cout << "Address of Vtable = " << (int*)*(int*)this << endl;
        cout << "Value at Vtable = " << (int*)*(int*)*(int*)this << endl;
        cout << endl;
    }
    virtual void f1() { cout << "Drive::f2" << endl; }
};

class MostDrive : public Drive {
public:
    MostDrive() {
        cout << "In MostDrive" << endl;
        cout << "Virtual Pointer = " << (int*)this << endl;
        cout << "Address of Vtable = " << (int*)*(int*)this << endl;
        cout << "Value at Vtable = " << (int*)*(int*)*(int*)this << endl;
        cout << endl;
    }
    virtual void f1() { cout << "MostDrive::f2" << endl; }
};

int main() {
    MostDrive d;
    return 0;
}
 
单步跟踪上面代码,发现依次进入Base、Driver、MostDrive的构造函数,每次进入构造函数后,虚指针的值都不一样。
得出结论,须指针是在进入构造函数前初始化的。
 
在构造函数中调用虚函数,结果会出现问题。
原因很简单,如果在Drive的构造函数中调用虚函数,但此时的虚函数指针还不是最终结果,最终结果需要进入最后一个构造函数,也就是
MostDrive的构造函数才能确定。
 
 
posted @ 2009-09-11 16:18  Fan Zhang  阅读(386)  评论(0编辑  收藏  举报