在C++中,虚函数(virtual function)是实现多态性的关键。当一个类含有虚函数时,编译器会为这个类创建一个虚函数表(vtable),并在类的实例中添加一个指向虚函数表的指针(vptr)。虚函数表是一个函数指针数组,其中每个元素都是一个指向类中虚函数的指针。
在继承中,子类会继承基类的虚函数表,并可以覆盖(override)基类的虚函数。当子类覆盖了基类的虚函数时,子类的虚函数表中对应的函数指针会被替换为子类的函数地址。此外,子类还可以添加新的虚函数,这将导致子类的虚函数表比基类的虚函数表更大。
在继承中,vptr的表现如下:
当创建一个子类的实例时,子类的构造函数会首先调用基类的构造函数。基类的构造函数会根据虚函数表的地址初始化vptr。因此,子类的实例中的vptr会指向子类的虚函数表。
当通过基类指针或引用调用虚函数时,程序会根据vptr找到正确的虚函数表,并在虚函数表中查找对应的函数指针。这样,即使是基类指针或引用,也可以正确地调用子类的虚函数实现。
当子类覆盖了基类的虚函数时,子类的虚函数表中对应的函数指针会被替换为子类的函数地址。这意味着当通过子类实例的vptr调用该虚函数时,将会调用子类的实现,而不是基类的实现。
如果子类没有覆盖基类的虚函数,那么子类的虚函数表中对应的函数指针仍然指向基类的实现。这意味着当通过子类实例的vptr调用该虚函数时,将会调用基类的实现。
总之,在C++继承中,vptr的主要作用是实现多态性。通过vptr和虚函数表,程序可以在运行时根据对象的实际类型来调用正确的虚函数实现。