c++虚函数是怎么实现的
作者:野牛程序员:2023-07-15 11:54:58 C++阅读 2657
C++中的虚函数是通过虚函数表(virtual function table)来实现的。虚函数表是一个存储了类中所有虚函数地址的数据结构。每个包含虚函数的类都会有一个对应的虚函数表。
当一个类定义了一个虚函数时,编译器会自动为该类创建一个虚函数表,并将该类的虚函数地址按照声明的顺序存储在虚函数表中。当类的对象被创建时,对象内部会有一个指针指向该类的虚函数表。
当通过指针或引用调用一个虚函数时,编译器会使用对象内部的虚函数表来确定调用哪个函数。这个过程通常是通过偏移量来实现的。编译器会根据对象的指针或引用找到对应的虚函数表指针,然后根据函数的索引在虚函数表中查找相应的函数地址。然后,通过该地址调用实际的函数。
这种机制允许在派生类中重写基类的虚函数,实现多态性。当基类的指针或引用指向派生类对象时,调用虚函数将会调用派生类中重写的函数,而不是基类中的函数。
下面是一个简单的示例代码,说明虚函数的工作原理:
#include <iostream>
class Base {
public:
virtual void foo() {
std::cout << "Base::foo() called" << std::endl;
}
};
class Derived : public Base {
public:
void foo() override {
std::cout << "Derived::foo() called" << std::endl;
}
};
int main() {
Base* ptr = new Derived();
ptr->foo(); // 调用派生类的虚函数
delete ptr;
return 0;
}输出结果为:
Derived::foo() called
在这个示例中,基类Base定义了一个虚函数foo(),派生类Derived重写了这个函数。在main()函数中,通过基类指针ptr指向一个派生类对象,然后调用ptr->foo(),由于foo()是虚函数,因此会根据对象的实际类型调用派生类Derived中的函数,输出结果为Derived::foo() called。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

