LEX*_*EXX 5 c++ virtual inheritance pointers base
我们来看看这段代码:
class CBase
{
public:
virtual vfunc() { cout << "CBase::vfunc()" << endl; }
};
class CChild: public CBase
{
public:
vfunc() { cout << "CChild::vfunc()" << endl; }
};
int main()
{
CBase *pBase = new CBase;
((CChild*)pBase)->vfunc(); // !!! important
delete pBase;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
CBase::vfunc()
Run Code Online (Sandbox Code Playgroud)
但我想看看:CChild :: vfunc()
显式((CChild*)pBase)强制转换为"CChild*".那么为什么调用派生的vfunc()我需要用以下代码替换"important"字符串:((CChild*)pBase) - > CChild :: vfunc();
这不是它的工作原理 - 这是:
CBase *pBase = new CChild;
pBase->vfunc();
Run Code Online (Sandbox Code Playgroud)
virtual函数调用是在指针和引用上动态解析的(除非你明确地调用方法,就像你所做的那样).这意味着你告诉编译器指针是什么并不重要,它将在vftable中查找方法.在你的情况下,这vftable是CBase.