C++ 如何使用虚函数实现多态_C++ 虚函数与多态机制解析


多态通过虚函数实现,允许基类指针调用派生类函数。基类中用virtual声明虚函数,派生类重写该函数,运行时通过虚函数表动态绑定具体实现。例如Animal基类的speak()被Dog和Cat类重写,调用makeSound(&dog)或makeSound(&cat)时分别执行对应版本。含纯虚函数(如Shape::draw()=0)的类为抽象类,不可实例化,子类必须实现纯虚函数才能创建对象。多态提升扩展性与维护性,新增类无需修改原有代码,但虚函数有性能开销,应按需使用。

在 C++ 中,多态是面向对象编程的重要特性之一,它允许使用基类指针或引用调用派生类的函数。实现这一机制的核心工具就是虚函数。通过虚函数,程序可以在运行时根据对象的实际类型决定调用哪个函数版本,而不是在编译时就确定。

虚函数的基本定义与使用

虚函数是在基类中使用 virtual 关键字声明的成员函数。当派生类重写该函数后,通过基类指针或引用调用该函数时,会自动调用对应派生类的实现。

例如:

#include 
using namespace std;

class Animal { public: virtual void speak() { cout << "Animal speaks." << endl; } };

class Dog : public Animal { public: void speak() override { cout << "Dog barks." << endl; } };

class Cat : public Animal { public: void speak() override { cout << "Cat meows." << endl; } };

在这个例子中,speak() 是一个虚函数。如果使用基类指针指向派生类对象并调用 speak(),程序将根据实际对象类型执行相应的函数。

运行时多态的实现方式

多态的关键在于动态绑定(late binding),即函数调用在运行时才确定具体调用哪一个函数。

实现过程如下:

  • 基类中声明虚函数,启用动态分派机制
  • 派生类使用 override 明确重写虚函数(推荐做法)
  • 通过基类指针或引用调用虚函数
  • 系统通过虚函数表(vtable)查找实际应调用的函数地址

示例调用代码:

void makeSound(Animal* animal) {
    animal->speak(); // 实际调用取决于传入的对象类型
}

int main() { Dog dog; Cat cat;

makeSound(&dog); // 输出: Dog barks.
makeSound(&cat); // 输出: Cat meows.

return 0;

}

纯虚函数与抽象类

有时我们希望基类不提供函数的具体实现,仅作为接口规范。这时可以使用纯虚函数

class Shape {
public:
    virtual void draw() = 0; // 纯虚函数
};

class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } };

包含纯虚函数的类称为抽象类,不能实例化对象。只有当派生类实现了所有纯虚函数后,才能创建该类的对象。

虚函数和多态机制让代码更具扩展性和可维护性。比如添加新的动物类型时,无需修改已有的 makeSound 函数,只要继承 Animal 并重写 speak 即可。

基本上就这些。理解虚函数表的存在和动态调用的过程,有助于写出更高效的多态代码。注意,虚函数有一定性能开销,因此应在需要时才使用。


# 工具  # ai  # c++  # ios  # win  # stream  # 面向对象编程  # speak  # 面向对象  # 多态  # 成员函数  # 子类  # 引用调用  # 指针  # 继承  # 虚函数  # 纯虚函数  # 接口  # 对象  # 重写  # 派生类  # 是在  # 类中  # 或引用  # 抽象类  # 时才  # 绑定  # 是一个 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 短链接还原php提示内存不足_调整PHP内存限制设置【技巧】  Windows10如何更改日期格式_Win10区域设置短日期修改  Windows11如何设置专注助手_Windows11专注助手使用攻略【技巧】  MAC的“接续互通”功能无法使用怎么办_MAC检查蓝牙、Wi-Fi和相同Apple ID登录  如何从 Go 的 map[string]interface{} 中安全获取值  Mac如何与安卓手机传文件_Mac和Android设备互通【必备工具】  Win11怎么设置麦克风权限_允许应用访问Win11麦克风【详解】  c++中explicit(bool)的用法 c++条件性explicit【C++20】  PHP cURL GET请求:正确设置认证与自定义请求头的完整教程  Win10如何卸载微软拼音输入法 Win10只保留一个输入法【教程】  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  Win11怎么设置屏保_Windows 11屏幕保护程序开启与设置【详解】  如何使用Golang实现Web表单数据绑定_自动映射字段到结构体  Win11怎么检查TPM2.0模块_Windows11受信任平台模块开启状态查询  如何使用Golang反射创建map对象_动态生成键值映射  PHP主流架构如何处理会话管理_Session与Cookie【技巧】  Python函数参数高级用法_默认值与可变参数解析【教程】  Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】  Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】  如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧  如何在 Windows 11 中使用 AlomWare 工具箱  Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式  Python实现图数据库操作_Neo4j核心CRUD与图算法解析  如何用正则与预处理结合精准拦截拼接式垃圾域名  Win11怎么设置开机问候语_自定义Win11锁屏提示信息【技巧】  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】  php修改数据怎么批量改状态_批量更新status字段值技巧【操作】  php485函数怎么捕获异常_php485错误处理机制设置技巧【操作】  MySQL 中使用 IF 和 CASE 实现查询字段条件化显示  如何使用正则表达式批量替换重复的 *- 模式为固定字符串  Win11怎么禁用键盘自带键盘_Win11笔记本禁用内置键盘方法【教程】  C#如何在一个XML文件中查找并替换文本内容  Win11如何关闭小娜Cortana Win11禁用Cortana语音助手【优化】  Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用  php订单日志怎么导出excel_php导出订单日志到表格教程【教程】  PHP主流架构怎么部署到Docker_容器化流程【操作】  c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】  Linux怎么设置磁盘配额_Linux系统Quota安装与用户空间限制【教程】  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  php嵌入式需要什么环境_搭建php+linux嵌入式开发环境【详解】  Python大文件处理策略_内存优化说明【指导】  Python集合操作技巧_高效去重解析【教程】  Go 中实现 Python urllib.quote() 功能的等效方法  如何在Golang中写入XML文件_生成符合规范的XML数据  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  Win11怎么设置鼠标宏_Win11鼠标按键自定义编程教程【详解】  c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】  如何诊断并终止卡死的 multiprocessing 子进程  Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】 

 2025-11-08

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.