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;
}
复制代码
相关推荐
是有头发的程序猿3 分钟前
Python爬虫实战:面向对象编程构建高可维护的1688商品数据采集系统
开发语言·爬虫·python
lkbhua莱克瓦245 分钟前
多线程综合练习3
java·开发语言·多线程·githup
肆悟先生14 分钟前
3.16 含有可变参数的函数
c++·算法
郝学胜-神的一滴15 分钟前
封装OpenGL的Shader相关类:从理论到实践
开发语言·c++·程序人生·游戏·图形渲染
想做后端的小C20 分钟前
Java:访问权限
java·开发语言
啃火龙果的兔子20 分钟前
java语言基础
java·开发语言·python
我命由我1234523 分钟前
Python 开发问题:No Python interpreter configured for the project
开发语言·后端·python·学习·pycharm·学习方法·python3.11
掘根27 分钟前
【消息队列项目】消费者管理模块实现
java·开发语言
lzhdim27 分钟前
C#应用程序取得当前目录和退出
开发语言·数据库·microsoft·c#
秋邱35 分钟前
Java基础语法核心:程序结构、注释规范、变量常量与数据类型
java·开发语言·spring cloud·tomcat·hibernate