多态通过虚函数实现,允许基类指针调用派生类函数。1. 基类中声明virtual函数;2. 派生类重写该函数;3. 用基类指针指向派生类对象并调用虚函数,实现运行时动态绑定。示例中Animal类的speak()为虚函数,Dog和Cat类重写speak(),通过Animal指针调用时输出各自声音。若未使用virtual,则调用基类函数,无法实现多态。含纯虚函数的类为抽象类,如Shape的draw()=0,不能实例化,子类必须实现纯虚函数。此外,基类析构函数应设为virtual,防止资源泄漏。
在C++中,多态是面向对象编程的核心特性之一,它允许使用基类指针或引用调用派生类的函数。这种行为通过虚函数(virtual function)和继承机制实现。下面介绍如何通过继承与虚函数实现多态。
多态指的是同一接口表现出不同行为的能力。在C++中,主要体现为:通过基类的指针或引用调用一个虚函数时,程序会根据对象的实际类型决定调用哪个版本的函数——即运行时动态绑定。
要在C++中启用多态,必须在基类中将希望被重写的函数声明为virtual。当派生类重写该函数后,通过基类指针调用时就会触发动态绑定。
示例代码:
#includeusing 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() 被声明为虚函数。Dog 和 Cat 类分别提供了自己的实现。
创建派生类对象,并用基类指针指向它们,调用 speak() 时会自动执行对应类型的版本。
int main() {
Animal* a1 = new Dog();
Ani
mal* a2 = new Cat();
a1-youjiankuohaophpcnspeak(); // 输出: Dog barks.
a2-youjiankuohaophpcnspeak(); // 输出: Cat meows.
delete a1;
delete a2;
return 0;
}
如果没有使用 virtual,则调用的是基类的函数版本,无法实现多态。
有时我们希望基类不提供具体实现,只作为接口规范。这时可以使用纯虚函数:
class Shape {
public:
virtual void draw() = 0; // 纯虚函数
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing a circle." << endl;
}
};
包含纯虚函数的类称为抽象类,不能实例化,只能被继承。派生类必须实现所有纯虚函数,否则仍是抽象类。
基本上就这些。只要掌握虚函数的声明、重写以及基类指针的使用,就能在C++中灵活运用多态机制。注意别忘了析构函数也应设为虚函数,以防资源泄漏。
# ai
# c++
# ios
# win
# stream
# 面向对象编程
# speak
# 面向对象
# 多态
# 子类
# 析构函数
# 引用调用
# 指针
# 继承
# 虚函数
# 纯虚函数
# 接口
# function
# 对象
# 重写
# 派生类
# 绑定
# 抽象类
# 设为
# 自己的
# 类中
# 的是
# 或引用
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】
如何在Golang中实现CI/CD流水线自动化测试_Golang持续集成测试执行方法
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
Win11时间不对怎么同步_Win11自动校准互联网时间【设置】
Windows 11怎么更改锁屏超时时间_Windows 11电源选项中设置屏幕关闭时间
How to Properly Use NumPy in VS Code
Windows10如何查看蓝屏日志_Win10使用事件查看器分析Dump文件
Win11怎么设置指纹解锁 Win11笔记本录入指纹登录【教程】
Mac如何创建和管理多个桌面空间_Mac高效多任务处理【技巧】
Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录
全球各国上班时间表外贸邮件时间
Windows如何查看和管理已安装的字体?(字体文件夹)
PythonWeb前后端整合项目教程_FastAPIReact完整实例
Go语言中slice追加操作的底层共享机制解析
MAC怎么解压RAR格式文件_MAC第三方解压工具安装与压缩包管理【教程】
c++中的CRTP是什么 c++奇异递归模板模式【进阶】
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何优化Golang程序CPU性能_Golang CPU密集型任务优化方法
Python性能剖析高级教程_cProfileLineProfiler优化案例解析
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
Win11如何设置环境变量 Win11添加和修改系统与用户变量【教程】
VSC怎么在PHP中调试MySQL_数据库交互排查技巧【教程】
Win11关机快捷键是什么_Win11快速关机方法【大全】
php报错怎么查看_定位PHP致命错误与警告的方法【教程】
Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】
c++ stringstream用法详解_c++字符串与数字转换利器
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
Win11怎么关闭透明效果_Windows11个性化颜色关闭透明
Win10怎么卸载剪映_Win10彻底卸载剪映方法【步骤】
Windows蓝屏错误0x0000001E怎么修复_KMODEEXCEPTIONNOTHANDLED排查
XSLT怎么生成动态的HTML属性名和标签名
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
Win11输入法选字框不见了怎么办_Win11输入法修复与重置【教程】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何在Golang中编写异步函数测试_Golang异步操作测试策略
Mac如何修改Hosts文件?(本地开发与屏蔽网站)
Win11怎么打开注册表_Windows 11注册表编辑器启动命令【步骤】
Windows蓝屏BAD_POOL_HEADER故障详解_蓝屏池损坏错误修复指南
c# 在高并发场景下,委托和接口调用的性能对比
Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】
Windows系统文件被保护机制阻止怎么办_权限不足错误处理方案
Win11怎么开启剪贴板历史记录_Windows11 Win+V键使用技巧
Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】
windows如何修改文件默认打开方式_windows设置程序关联教程
php做exe支持多线程吗_并发处理实现方式【详解】
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
C#如何在一个XML文件中查找并替换文本内容
Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】
2025-11-09
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。