Case:
父类指针指向子类,调用父类的成员函数test, 子类并没有重新实现该函数。 父类中该函数调用了函数func, 子类重新实现了该函数。
code:
class base
{
public:
base() {}
virtual void func() {
cout << "Base::func" << endl;
}
virtual void test() {
func();
}
};
class aa:public base
{
public:
aa() {}
virtual void func() {
cout << "aa::func" << endl;
}
};
int main() {
base* p = new aa;
p->test();
}
输出结果为: aa::func
分析:
base类和aa类都有自己的虚函数表,由于aa类没有重载base::test,所以aa类的虚函数表中的第二个函数地址为base::test。
根据虚函数的调用机制,main函数中p->test()会调用子类的虚函数表中的test函数,即base::test,另外,每个成员函数都有一个默认入参this, 传递给test的this指针对应子类对象, 然后test内部触发func函数,其实触发方式为this->func,同理,由于func也是虚函数,虚函数的调用机制使得最终触发的是子类的aa::func.