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

c++虚函数表和虚函数指针

作者:野牛程序员:2023-08-01 17:54:51 C++阅读 2428

在 C++ 中,虚函数表(Virtual Function Table,VTable或VTBL)是用于实现多态性的一种机制,而虚函数指针(vptr)则是用来访问虚函数表的指针。让我们分别解释它们的含义:

  1. 虚函数表(VTable):

    • 虚函数表是一个特殊的数据结构,用于存储包含虚函数的类的虚函数地址。

    • 每个包含虚函数的类都有自己的虚函数表,其中包含该类的虚函数地址,按照它们在类中声明的顺序排列。

    • 当对象通过指针或引用调用虚函数时,编译器会在运行时通过虚函数表查找正确的虚函数地址,并调用相应的虚函数。

    • 虚函数表的创建是在编译期完成的,并且在对象的内存布局中作为隐藏成员存在。

  2. 虚函数指针(vptr):

    • 虚函数指针是一个额外的指针,它位于对象的内存布局的开头或结尾处。

    • 每个包含虚函数的类的对象都有一个虚函数指针,指向相应类的虚函数表。

    • 虚函数指针的存在允许在运行时通过指针或引用调用正确的虚函数,实现多态性。

    • 虚函数指针在对象的构造过程中被设置为正确的虚函数表地址,在对象的析构过程中被清除。

    • 虚函数指针的创建和管理是由编译器负责的,开发者无需显式处理虚函数指针的操作。

下面是一个示例,展示了虚函数表和虚函数指针的概念:

#include <iostream>

class Shape {
public:
    virtual void draw() {
        std::cout << "Drawing a shape." << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

int main() {
    Circle circle;

    // Creating a base class pointer and pointing it to the Circle object
    Shape* shapePtr = &circle;

    // Calling the draw() function through the base class pointer
    shapePtr->draw(); // Output: "Drawing a circle."

    return 0;
}

在上面的示例中,定义了 ShapeCircle 两个类,其中 Shape 类有一个虚函数 draw()。我们通过将 Circle 对象地址赋给 Shape 类型的指针 shapePtr,实现了通过虚函数指针在运行时调用正确的虚函数,从而实现多态性。输出结果为 "Drawing a circle.",这表明在运行时正确地调用了 Circle 类的 draw() 函数。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击