当前位置:首页 C++ > 正文

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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击