虚表指针

来源:互联网 发布:linux制作u盘启动盘 编辑:程序博客网 时间:2024/05/16 09:11
class Base;
Base *pBase;

class Base
{
public:
Base()
{
pBase = this;
}
virtual void Fn()
{
cout << "Call Base" << endl;
}
protected:
private:
};

class Derive :public Base
{
//public:
void Fn()
{
cout << "Call Derived" << endl;
}
};

Derive aa;

int _tmain(int argc, _TCHAR* argv[])
{
pBase->Fn();
return 0;
}

在Base类的构造函数中将this指针保存到pbase全局变量中,再定义全局对象aa,即调用derived aa时,要调用基类的构造函数先构造基类部分,然后是子类的部分由这两部分拼接出完整的对象aa,这个this指针指向的当然也就是aa对象,那么我们在main()函数中利用pbase调用fn(),因为pbase实际指向的是aa对象,而aa对象内部的虚表指针指向的是自身的虚表,最终调用的当然是derived类中的fn()函数。只有在子类的构造函数调用完毕后,整个虚表才构建完毕,此时才能真正应用C++的多态性。
换句话说我们不要在构造函数中去调用虚函数,当然如果你只是想调用本类的函数,也无所谓。
原创粉丝点击