2
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()派生的呢?

4

2 回答 2

7

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

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

于 2012-04-15T11:09:57.313 回答
2

完全按照您所说的方式,通过vptr在类成员中使用。它知道函数是virtual,因此它知道它必须通过虚函数表调用它。

于 2012-04-15T11:09:57.407 回答