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;
}
复制代码
相关推荐
码云数智-大飞几秒前
Rust的所有权模型如何消除内存安全问题?与C++的RAII有何异同?
开发语言
如意猴4 分钟前
【前端】002--怎样制作一个简历界面?
开发语言·前端·javascript
夜珀6 分钟前
OpenTiny NEXT 从入门到精通·第 6 篇
开发语言·前端框架
paeamecium12 分钟前
【PAT甲级真题】- Count PAT‘s (25)
c++·算法·动态规划·pat考试·pat
九英里路17 分钟前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串
A.A呐24 分钟前
【C++第二十七章】C++类型转换
c++
仍然.26 分钟前
多线程---CAS,JUC组件和线程安全的集合类
java·开发语言
航Hang*27 分钟前
VMware vSphere 云平台运维与管理基础——第5章:VMware vSphere 5.5 高级特性
运维·服务器·开发语言·windows·学习·虚拟化
kaico201833 分钟前
python操作数据库
开发语言·数据库·python
zhangzeyuaaa33 分钟前
Python变量的四种作用域
开发语言·python