我们来看看这段代码:
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 中查找方法。在你的情况下,这是vftable
of CBase
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)