回答如下:
当编译器发现类中有虚函数时
,会创建一张虚函数表
,把虚函数对应的函数入口地址放进虚函数表中
,并在类中创建一个指针
,指向虚函数表。
当派生类继承自具有虚函数的类时,编译器会为派生类也创建一个虚函数表
,记录每一个虚函数,并也有一个指针指向该虚函数表。当派生类重写了父类对应的虚函数时,派生类的虚函数表中对应的父类虚函数地址就替换为派生类所重写的虚函数地址
。
当使用父类指针或引用调用虚函数时,编译器就可以根据指向或引用的实际对象类型
,来调用虚函数的版本,产生不同的行为。