C++ 虚函数表

虚函数表

当一个类中声明了虚函数时,这个函数在编译时会被标记为虚函数,并且对应的虚函数表中会为这个类生成一个虚函数表;

当基类指针指向派生类对象时,如果这个函数被调用,实际上调用的是派生类中的函数。这是因为在派生类中,虚函数表被重写了,指针指向了派生类中的对应函数。

cpp 复制代码
```cpp
  #include <iostream>

// 基类 Animal
class Animal {
public:
    // 虚函数 speak,可以被派生类重写
    virtual void speak() {
        std::cout << "Animal speaks" << std::endl;
    }
};

// 派生类 Dog,继承自 Animal
class Dog : public Animal {
public:
    // 重写基类的虚函数 speak
    void speak() override {
        std::cout << "Dog barks" << std::endl;
    }
};

// 派生类 Cat,继承自 Animal
class Cat : public Animal {
public:
    // 重写基类的虚函数 speak
    void speak() override {
        std::cout << "Cat meows" << std::endl;
    }
};

int main() {
    // 创建 Animal 类型的指针,指向派生类对象
    Animal* animal;

    // 创建 Dog 对象并将其地址赋给 animal 指针
    animal = new Dog();
    // 调用虚函数 speak,实际调用的是 Dog 类中的 speak 函数
    animal->speak(); // 输出: Dog barks

    // 创建 Cat 对象并将其地址赋给 animal 指针
    animal = new Cat();
    // 调用虚函数 speak,实际调用的是 Cat 类中的 speak 函数
    animal->speak(); // 输出: Cat meows

    // 释放内存
    delete animal;

    return 0;
}
复制代码
相关推荐
黑不溜秋的10 分钟前
C++ 编程指南36 - 使用Pimpl模式实现稳定的ABI接口
开发语言·c++
慕容静漪1 小时前
本地部署Code Llama大模型结合Text generation Web UI远程运行LLM
开发语言·后端·golang
zilong_zzz1 小时前
系统编程3(共享内存/信号量)
java·开发语言
肾透侧视攻城狮1 小时前
深入浅出一下Python函数的核心概念与进阶应用
开发语言·python·map·filter·闭包·reduce·py偏函数
zy0101011 小时前
useEffect
开发语言·前端·javascript·react·useeffect
五行星辰1 小时前
SAX解析XML:Java程序员的“刑侦破案式“数据处理
xml·java·开发语言
kovlistudio1 小时前
红宝书第四十讲:React 核心概念:组件化 & 虚拟 DOM 简单教程
开发语言·前端·javascript·学习·react.js·前端框架
地球驾驶员1 小时前
NX二次开发C#---搭建NX开发环境(NX1926+VS2019)
开发语言·c#
zx13232 小时前
chrome提示https不安全, 不能记住账号密码怎么办? 可以利用js输入账号
开发语言·javascript·ecmascript
快乐老干妈2 小时前
STL-list链表
c++·链表·list