从普通函数调用虚拟函数

Virtual function call from a normal function

本文关键字:虚拟 函数 函数调用      更新时间:2023-10-16
class base
{
public:
    void virtual func(){cout<<"base";}
    void check()
    {
        func();
    }
};
class derived: public base
{
public:
    void func(){cout<<"dervied";}
};
int main()
{
    base *obj = new derived();
    obj->check();
    return 0;
}

上面的代码打印在控制台上派生。现在,我理解了虚函数的概念,但我无法在这里应用它。在我的理解中,每当我们调用虚拟函数时,编译器都会修改对"this->vptr->virtualfunc()"的调用,这就是最重派生的类函数被调用的方式。但在这种情况下,由于check()不是虚函数,编译器如何确定它需要调用派生func()

编译器如何确定它需要调用派生的 func()?

以相同的方式 - 通过调用this->vptr->virtualfunc().回想一下,即使在基类中,this也属于派生类,因为每个派生类也是一个基类,因此访问虚函数的相同方法也适用于它。

正如您所说的那样,通过使用类成员中的vptr。它知道函数是virtual的,所以它知道它必须通过虚函数表来调用它。