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()
?
答案 0 :(得分:7)
编译器如何确定它需要调用派生的?(/ p>)的func()
以相同的方式 - 通过调用this->vptr->virtualfunc()
。回想一下,即使在基类内,this
也属于派生的类,因为每个派生类也是基类,所以访问虚拟的方式相同功能也适用于它。
答案 1 :(得分:2)
正如你所说的那样,通过使用类成员中的vptr
。它知道函数是virtual
,因此它知道它必须通过虚函数表调用它。