C++(虚函数实现多态基本原理)



在C++中,加上 virtual 关键字可以实现多态,这是因为它允许函数在基类和派生类中有不同的实现,并确保在运行时正确调用派生类的方法。具体来说,这种机制称为“动态绑定”或“运行时多态”。



1. 概念

  1. 虚函数(Virtual Function)
    当你在基类中声明一个函数为 virtual 时,C++ 会为该函数在类的对象中创建一个虚函数表(vtable)。虚函数表是一个指针数组,其中每个元素指向类中虚函数的实现。每个类对象都有一个指向其虚函数表的指针(vptr)。

  2. 虚函数表(vtable)
    虚函数表包含了指向该类中虚函数实现的指针。基类和每个派生类都有自己的虚函数表。基类中的虚函数表包含基类中虚函数的地址,派生类中的虚函数表则可能包含不同的地址,指向派生类中重写的虚函数实现。

  3. 动态绑定(Dynamic Binding)
    当通过基类指针或引用调用虚函数时,C++ 运行时会通过虚函数表来决定实际调用哪个类的实现。这意味着,即使你使用的是基类的指针或引用,实际调用的仍然是派生类的实现,这取决于指针或引用所指向的对象的实际类型。



2. 示例

假设你有以下类结构:

class Animal {
public:
    virtual void speak() {
        cout << "动物在说话" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        cout << "小猫在说话" << endl;
    }
};

如果你创建一个 Cat 对象并通过 Animal 指针调用 speak 方法:

Animal* animal = new Cat();
animal->speak();

虽然 animalAnimal 类型的指针,但因为 speak 是虚函数,程序会使用 animal 对象的 vptr,查找 Cat 的虚函数表,并调用 Cat 类中实现的 speak 方法。这会输出 小猫在说话



3. 总结

加上 virtual 关键字使得函数调用可以在运行时根据对象的实际类型动态决定调用哪个函数,从而实现了多态。虚函数表和虚函数指针的机制允许不同类型的对象在运行时执行正确的函数实现,这是面向对象编程中多态性的核心特性。



posted @   做梦当财神  阅读(47)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示