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;
}
复制代码
相关推荐
不灭的黄金瞳1234 分钟前
Java数据类型与变量
java·开发语言·intellij-idea
f狐0狸x8 分钟前
【C++修炼之路】C++继承的探索
c++·继承
虚无的纽扣12 分钟前
【C++】C++11的魔法:不止右值引用,C++11赋予的编程神力
c++
小白学大数据23 分钟前
Python 项目实战:用 Flask 构建生产级 MySQL 增删改查 REST API
开发语言·人工智能·python·mysql·flask
Nil20837 分钟前
leetcode 20有效的括号
开发语言
jaysee-sjc1 小时前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis
码匠许师傅1 小时前
【C++三方组件】RE2:工业级正则的安全与性能
c++
ThornArmor1 小时前
《向内深潜,向外飞掠》
c语言·开发语言·c++·vim·visual studio
传奇开心果编程1 小时前
【仓颉语言基础语法学与练】第1课:从零开始
开发语言·学习·华为
j7~1 小时前
【C++微服务项目开发脚手架】(环境篇)虚拟机 + Docker + MySQL/Redis/RabbitMQ/ES/etcd/FastDFS 全套配齐
linux·c++·ubuntu·docker·vmware·项目开发·微服务脚手架