[CareerCup] 13.3 Virtual Functions 虚函数

简介:

13.3 How do virtual functions work in C++?

这道题问我们虚函数在C++中的工作原理。虚函数的工作机制主要依赖于虚表格vtable,即Virtual Table。当类中定义了虚函数时,一个虚表格就建立了用来保存该类的虚函数的地址。此时编译器Compiler也会在该类中增加一个虚指针vptr(Virtual Pointer),用来指向虚表格。当一个虚函数在派生类中没有被重写时,派生类中的虚表格中仍然存的是基类的虚函数的地址。当虚函数被调用时,就要到虚表格中取找函数地址。C++中的动态绑定机制主要就是通过虚表格来实现的。

当我们将基类的指针指向一个派生类的实体时,虚指针vptr就指向派生类的虚表格,这样就保证了派生类中的虚函数能被调用,参见如下代码:

class Shape {
public:
    int edge_len;
    virtual int circumference() {
        cout << "Circumference of Base Class\n";
        return 0;
    }
};
class Triangle: public Shape {
public:
    int circumference() {
        cout << "Circumference of Triangle Class\n";
        return 3 * edge_len;
    }
};
int main() {

    Shape *x = new Shape(); 
    x->circumference(); // "Circumference of Base Class"
    Shape *y = new Triangle();
    y->circumference(); // "Circumference of Triangle Class"
    
    return 0;
}

本文转自博客园Grandyang的博客,原文链接:虚函数[CareerCup] 13.3 Virtual Functions ,如需转载请自行联系原博主。

相关文章
|
文件存储 Docker 智能硬件
DIY nas之casaOS云系统&Home Assistant
CasaOS是一个基于Docker生态系统的开源家庭云系统,专为家庭场景而设计,它可以让您创建自己的云服务器
2657 1
|
8月前
|
机器学习/深度学习 人工智能 算法
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
RAGEN是一个基于StarPO框架的开源强化学习系统,通过马尔可夫决策过程形式化Agent与环境的交互,支持PPO、GRPO等多种优化算法,显著提升多轮推理训练的稳定性。
877 5
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
|
存储 C++ 内存技术
解码mp4文件分别存储为pcm,yuv文件
使用FFmpeg库在C++中解码MP4文件,并将音频数据存储为PCM格式,视频数据存储为YUV格式。
228 3
解码mp4文件分别存储为pcm,yuv文件
|
存储 JavaScript 安全
|
SQL 安全 数据安全/隐私保护
DVWA Open HTTP Redirect 通关解析
DVWA Open HTTP Redirect 通关解析
|
存储 网络协议 网络安全
IP路由详解:网络互联的心脏
【4月更文挑战第22天】
941 7
IP路由详解:网络互联的心脏
|
Ubuntu Linux Python
可以使用阿里云提供的Linux云主机,然后在其上安装银河麒麟v10sp1
可以使用阿里云提供的Linux云主机,然后在其上安装银河麒麟v10sp1
1792 1
|
JavaScript Linux 应用服务中间件
Docker部署Node应用简单实践
本文将从零至一,介绍如何在云服务器上通过 Docker 容器运行一个简单的Node应用。
2750 0
|
Android开发
android studio找不到aar问题解决
android studio找不到aar问题解决
728 0
一日一技:为mitmproxy设置上游代理
一日一技:为mitmproxy设置上游代理
1718 0