让我们看一下这段代码:

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;
}

输出为:
CBase::vfunc()

但我想看看:CChild::vfunc()

显式((CChild *)pBase)强制转换为“CChild *”类型。那么为什么要调用派生的vfunc(),我需要将“重要”字符串替换为:
((CChild *] pBase)-> CChild::vfunc();

最佳答案

那不是它的工作原理-这是:

CBase *pBase = new CChild;
pBase->vfunc();
virtual函数调用是在指针和引用上动态解析的(除非像您一样显式地调用该方法)。这意味着您告诉编译器指针是什么都无所谓,它将在vftable中寻找方法。在您的情况下,这是vftableCBase

07-27 13:35