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

c++虚函数指针

作者:野牛程序员:2023-12-27 13:41:35 C++阅读 2395

C++中的虚函数和虚函数表(vtable)是实现多态性的关键概念之一。当一个类中包含虚函数时,每个对象都会有一个指向虚函数表的指针,这个指针通常在对象的内存布局中的开头位置。虚函数表是一个数组,包含了该类所有虚函数的地址。

当一个类派生自另一个类,它会继承父类的虚函数表,并添加自己的虚函数。派生类的对象将包含指向其自身虚函数表的指针。

虚函数指针的存在使得在运行时能够正确地调用相应的虚函数,实现了动态绑定。动态绑定允许在运行时根据对象的实际类型调用相应的虚函数,而不是根据编译时类型。

以下是一个简单的示例说明:

#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base class\\n";
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived class\\n";
    }
};

int main() {
    Base baseObj;
    Derived derivedObj;

    // 虚函数指针指向虚函数表
    void (*vfuncPtr)() = nullptr;

    // 指向基类对象的虚函数表
    vfuncPtr = reinterpret_cast<void (*)()>(*(reinterpret_cast<void**>(&baseObj)));

    // 调用基类的虚函数
    vfuncPtr();

    // 指向派生类对象的虚函数表
    vfuncPtr = reinterpret_cast<void (*)()>(*(reinterpret_cast<void**>(&derivedObj)));

    // 调用派生类的虚函数
    vfuncPtr();

    return 0;
}

上述示例中,通过使用reinterpret_cast将虚函数表指针转换为函数指针,并通过这个函数指针调用虚函数,实现了动态绑定。在实际应用中,通常不需要手动操作虚函数表,而是由编译器自动生成和管理。


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

最新推荐

热门点击