【面试刷题】——C++虚函数原理

C++中的虚函数是面向对象编程中的一个关键概念,它允许多态性(Polymorphism)的实现,使得在运行时能够根据对象的实际类型来调用正确的函数。虚函数的原理涉及到虚函数表(vtable)和虚函数指针(vptr)的概念。

以下是C++虚函数的基本原理:

虚函数的声明:

在C++中,通过在基类(父类)中的函数声明前面加上virtual关键字,将一个函数声明为虚函数。派生类(子类)可以选择性地覆盖这些虚函数。

cpp 复制代码
class Base {
public:
    virtual void foo() {
        // 基类虚函数的默认实现
    }
};

虚函数表(vtable):

每个包含虚函数的类都会有一个虚函数表。虚函数表是一个指针数组,其中包含了该类中所有虚函数的指针。虚函数表在编译时创建,并在运行时使用。每个对象的虚函数表指针指向其所属类的虚函数表。

虚函数指针(vptr):

每个对象都包含一个虚函数指针(vptr),该指针指向该对象所属类的虚函数表。虚函数指针是隐藏在对象内部的,程序员无需手动管理。

动态绑定:

当通过基类指针或引用调用虚函数时,C++会在运行时查找虚函数表,以确定应该调用哪个实际的函数。这个过程被称为动态绑定。通过动态绑定,程序能够在运行时根据对象的实际类型来调用适当的虚函数。

cpp 复制代码
Base* ptr = new Derived();
ptr->foo(); // 调用Derived类的foo(),而不是Base类的默认实现

覆盖(Override):

派生类可以覆盖基类中的虚函数,提供自己的实现。覆盖的函数具有相同的函数签名(名称、参数类型和返回类型),并且必须被声明为virtual。覆盖后,派生类的虚函数将替代基类的虚函数。

cpp 复制代码
class Derived : public Base {
public:
    void foo() override {
        // 派生类覆盖的虚函数实现
    }
};

虚函数的使用使得在面向对象编程中实现多态性变得更加灵活和动态。通过虚函数,程序能够在运行时根据对象的实际类型来选择正确的函数实现,这是实现多态性的关键机制。虚函数表和虚函数指针是C++编译器用来实现这一机制的内部工具。

相关推荐
PAK向日葵1 小时前
【C++】整数类型(Integer Types)避雷指南与正确使用姿势
c++·安全·面试
ShineWinsu6 小时前
对于C++:继承的解析—上
开发语言·数据结构·c++·算法·面试·笔试·继承
码农阿豪6 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
直有两条腿7 小时前
【大模型】Langchain4j
java·langchain
love530love7 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
消失的旧时光-19437 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
莫寒清7 小时前
ThreadLocal
java·面试
学习是生活的调味剂8 小时前
spring bean循环依赖问题分析
java·后端·spring
抓饼先生8 小时前
iceoryx编译和验证
linux·c++·零拷贝·iceoryx
王老师青少年编程9 小时前
2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组