如何通过基类指针调用派生类的虚函数

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();

Luc*_*ore 6

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

CBase *pBase = new CChild;
pBase->vfunc();
Run Code Online (Sandbox Code Playgroud)

virtual函数调用是在指针和引用上动态解析的(除非你明确地调用方法,就像你所做的那样).这意味着你告诉编译器指针是什么并不重要,它将在vftable中查找方法.在你的情况下,这vftableCBase.


Jam*_*lis 5

你不能. *pBase是一个类型的对象CBase.您不能将它视为a,CChild因为它不是CChild对象.

使用强制转换获得的指针CChild*会导致程序显示未定义的行为.