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;
}
复制代码
相关推荐
编程(变成)小辣鸡2 分钟前
JVM、JRE和JDK 的关系
java·开发语言·jvm
a程序小傲21 分钟前
得物Java面试被问:流批一体架构的实现和状态管理
java·开发语言·数据库·redis·缓存·面试·架构
xb113221 分钟前
C#异步编程入门概念及核心概念
开发语言·c#
黎雁·泠崖25 分钟前
Java继承:成员变量访问(就近原则+this/super用法)
java·开发语言
ShineWinsu39 分钟前
对于C++:模版初阶的解析
开发语言·c++·面试·笔试·函数··模版
Max_uuc44 分钟前
【C++ 硬核】告别 Excel 生成数组:利用 constexpr 实现编译期计算查找表 (LUT)
开发语言·c++·excel
m0_748248651 小时前
C++正则表达式攻略:从基础到高级应用
java·c++·正则表达式
墨雨晨曦881 小时前
leedcode刷题总结
java·开发语言
嫂子开门我是_我哥1 小时前
第十六节:异常处理:让程序在报错中稳定运行
开发语言·python
退休钓鱼选手1 小时前
[CommonAPI + vsomeip]通信 原理 1
c++·自动驾驶