多态通过虚函数和纯虚函数实现,允许基类指针调用派生类函数。1. 虚函数使用virtual关键字声明,通过指针或引用触发动态绑定;2. 编译器为含虚函数的类生成vtable,对象包含vptr指向该表;3. 纯虚函数语法为virtual func() = 0,含有纯虚函数的类为抽象类,不能实例化;4. 实现多态需满足:继承关系、基类函数为virtual、派生类重写函数、通过基类指针或引用调用。
多态是面向对象编程的重要特性之一,C++通过虚函数和纯虚函数实现动态多态。它允许基类指针或引用在运行时调用派生类的函数,从而实现“一个接口,多种实现”的效果。
在基类中使用 virtual 关键字声明的成员函数称为虚函数。当派生类重写该函数后,通过基类指针或引用调用该函数时,会根据实际对象类型决定调用哪个版本。
关键点:
- 必须通过指针或引用调用虚函数才能触发动态绑定- 虚函数在基类中可以有定义,也可以被重写- 编译器为包含虚函数的类生成虚函数表(vtable),每个对象包含指向该表的指针(vptr)示例代码:
class Animal {
public:
virtual void speak() {
cout << "Animal speaks" << endl;
}
virtual ~Animal() {} // 建议虚析构函数
};
class Dog : public Animal {
public:
void speak() override {
cout << "Dog barks" << endl;
}
};
// 使用
Animal* pet = new Dog();
pet->speak(); // 输出:Dog barks
纯虚函数是一种特殊的虚函数,在基类中没有实现,要求派生类必须提供具体实现。含有纯虚函数的类称为抽象类,不能实例化。
语法格式:virtual 返回类型 函数名(参数) = 0;
作用:
- 定义接口规范,强制派生类实现特定功能- 实现更彻底的多态设计- 支持回调、插件架构等高级设计模式示例:
class Shape {
public:
virtual double area() const = 0; // 纯虚函数
virtual ~Shape() = default;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() const override {
return 3.14159 radius radius;
}
};
Shape 是抽象类,无法创建 Shape 对象,但可
以用 Shape* 指向具体的图形对象,并统一调用 area()。
要成功实现运行时多态,需满足以下条件:
- 继承关系:派生类继承自同一个基类- 虚函数:基类中的函数必须声明为 virtual- 重写:派生类正确重写虚函数(函数签名一致)- 指针或引用:通过基类指针或引用调用函数注意:函数重载、隐藏不会触发多态行为。
基本上就这些。掌握虚函数机制和抽象接口设计,就能灵活运用C++的动态多态能力。不复杂但容易忽略细节。
# c++
# 面向对象编程
# speak
# 架构
# 面向对象
# 多态
# 成员函数
# 引用调用
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# 函数重载
# 对象
# 重写
# 派生类
# 或引用
# 类中
# 抽象类
# 绑定
# 是一种
# 就能
# 回调
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置桌面图标间距_Windows11注册表IconSpacing修改
Windows10如何更改桌面背景_Win10个性化幻灯片放映设置
如何在 PHP 中按相同键合并两个关联数组为二维数组
如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】
c++如何用AFL++进行模糊测试 c++ Fuzzing入门【安全】
Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】
Win10任务栏天气和资讯怎么关闭 Win10禁用新闻和兴趣功能【教程】
Win11怎么关闭VBS安全性_Windows11提升游戏性能关闭虚拟化安全
Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】
Windows10如何更改鼠标灵敏度_Win10鼠标属性指针选项调节
Python项目回滚策略_发布安全说明【指导】
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
Win11如何开启telnet服务 Win11启用Telnet客户端【步骤】
Python邮件系统自动化教程_批量发送解析与模板应用
如何在 Django 中安全修改用户密码而不使会话失效
mac怎么安装adb_MAC配置Android ADB开发环境【详解】
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何在 Go 结构体中正确初始化 map 字段
Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标
php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】
Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】
Python网络超时处理_健壮性设计说明【指导】
Win11讲述人怎么关闭_Win11误触开启语音朗读关闭【快捷键】
Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】
c++如何判断文件是否存在_c++ filesystem库用法
Go 中 := 短变量声明的类型推导机制详解
Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件
Win11怎么设置默认邮件客户端 Win11修改Mail应用关联【教程】
如何使用Golang处理静态文件缓存_提高页面加载速度
如何解决同一段404代码在不同主机上表现不一致的问题
如何在 Go 中正确反序列化多个同级 XML 元素(而非单个根节点)
如何使用Golang实现多重错误处理_Golangerror组合与判断方法
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用
c++ namespace命名空间用法_c++避免命名冲突
Win11怎么设置系统还原_Windows11系统属性保护设置
如何在 Go 应用中实现自动错误恢复与进程重启机制
Python数据挖掘进阶教程_分类回归与聚类案例解析
Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】
c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】
如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
Win10如何更改开机密码_Windows10登录选项更改密码
Win10如何备份驱动程序_Win10驱动备份步骤【攻略】
Win11声音忽大忽小怎么办 Win11音频增强功能关闭教程【修复】
Mac如何调整Dock栏大小和位置_Mac程序坞个性化设置
Python音视频处理高级项目教程_FFmpegPydub剪辑与特效
如何使用正则表达式提取以编号开头、后跟多个注解的完整代码块
Win10怎样清理C盘浏览器缓存_Win10清理浏览器缓存步骤【步骤】
2025-12-02
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。