C++多态的理解,笔记

news/2025/2/12 19:36:01/

多态

多态(Polymorphism)是C++面向对象编程的一个关键概念,它允许你以一种通用的方式处理不同类型的对象,而无需了解它们的具体类型。C++中的多态性通过虚函数(virtual functions)来实现,主要包括两种形式:

多态是一种让你能够以相同的方式处理不同对象的编程概念。这意味着你可以使用相同的代码来处理不同类型的东西,而不需要知道它们的确切类型。

举个例子,想象你有一个玩具箱,里面装着不同类型的玩具,如汽车、娃娃和飞机。多态就像是一种魔法,让你可以使用相同的方式(例如,按下一个按钮)来玩不同类型的玩具,而不用关心你手中拿的到底是什么。无论你按下按钮的对象是汽车、娃娃还是飞机,都会有不同的响应。这就是多态的简单示例,它让你以一种通用的方式处理不同类型的对象。

#include <iostream>class Animal {
public:void makeSound(){std::cout << "动物发出声音" << std::endl;}
};class Dog : public Animal {
public:void makeSound()  {std::cout << "狗发出汪汪的声音" << std::endl;}
};class Cat : public Animal {
public:void makeSound()  {std::cout << "猫发出喵喵的声音" << std::endl;}
};int main() {Animal* myAnimal;Dog myDog;Cat myCat;myAnimal = &myDog;myAnimal->makeSound(); // 调用狗的声音myAnimal = &myCat;myAnimal->makeSound(); // 调用猫的声音return 0;
}
会输出:
动物发出声音
动物发出声音

添加上关键字virtual

#include <iostream>class Animal {
public:virtual void makeSound(){std::cout << "动物发出声音" << std::endl;}
};class Dog : public Animal {
public:virtual void makeSound(){std::cout << "狗发出汪汪的声音" << std::endl;}
};class Cat : public Animal {
public:virtual void makeSound(){std::cout << "猫发出喵喵的声音" << std::endl;}
};int main() {Animal* myAnimal;Dog myDog;Cat myCat;myAnimal = &myDog;myAnimal->makeSound(); // 调用狗的声音myAnimal = &myCat;myAnimal->makeSound(); // 调用猫的声音return 0;
}输出:
狗发出汪汪的声音
猫发出喵喵的声音

构造函数的作用

对象初始化: 构造函数用于初始化类的对象,确保对象在创建后处于已知和一致的状态。它可以设置对象的成员变量,分配资源,或执行其他必要的初始化操作。

提供默认值: 构造函数可以为类的成员变量提供默认值,以确保对象在创建时具有合理的初始状态。这对于避免未初始化变量的问题非常有用。

资源分配和释放: 如果类需要管理资源(例如内存、文件句柄等),构造函数可以用来分配资源,而析构函数用于释放资源。这确保了资源的正确分配和释放,避免资源泄漏。

初始化成员: 构造函数可以用于初始化类的成员变量,包括调用其他构造函数来初始化基类或成员对象。

参数化对象: 构造函数可以接受参数,允许在创建对象时传递特定的初始化值,以满足不同对象的需求。这有助于实现对象的个性化初始化。

重载构造函数: 一个类可以有多个构造函数,每个构造函数可以接受不同的参数,以便在不同情况下执行不同的初始化操作。这称为构造函数重载。

构造函数的命名与类名相同,没有返回类型(包括不是void),通常使用成员初始化列表来初始化成员变量。在C++中,构造函数可以有默认参数,允许创建对象时省略某些参数,或提供自定义初始化。

总之,构造函数是用于初始化类对象的重要机制,它确保对象在创建时具有合适的状态,并有助于避免潜在的问题,如未初始化变量或资源泄漏


http://www.ppmy.cn/news/1157849.html

相关文章

Day1力扣打卡

打卡记录 最长相邻不相等子序列 I&#xff08;脑筋急转弯&#xff09; 链接 思路&#xff1a;形如 11100110001 要达到最大&#xff0c;必须在重复数字选出一个&#xff0c;即在111中取一个1&#xff0c;在00中取一个0&#xff0c;以此类推最终便得到最长相邻不相等子序列。 c…

windows内网渗透正向代理

内网渗透正向代理 文章目录 内网渗透正向代理1 正向代理图2 环境准备2.1 正向代理需求&#xff1a; 3 网卡配置3.1 【redream】主机3.2 【base】主机双网卡3.3 【yvkong】网卡设置 4 启动4.1【redream】网卡配置&#xff1a;4.2【base】网卡配置&#xff1a;4.3【yvkong】网卡地…

[GSEP202306 一级] C++ 时间规划

题目描述 小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟&#xff0c;你通过编程帮他做到吗? 输入格式 输入4行&#xff0c;第一行为开始时刻的小时&#xff0c;第二行为开始时刻的分钟&#xff0c;第三行为结束时刻的小时&#xff0c;第四行为结束时刻的分…

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪&#xff0c;默认阈值消噪&#xff0c;强制消噪&#xff0c;给定软阈值消噪方法&#xff0c;数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000

redis的应用

文章目录 一.分布式锁1.简易版2.Redisson 二.延时队列1.异步消息队列2.加锁冲突失败处理3.zset实现延迟队列 三.位图四.HyperLogLog1.基本命令2.实现原理 五.布隆过滤器六.简单限流1.实现2.缺点 七.漏斗限流八.GeoHash九.scan1.keys2.scan 一.分布式锁 可以保证操作的原子性。…

Windows10安装MySQL5.7.43

下载安装包 mysql-5.7.43-winx64.zip 解压到目录C:\Program Files\mysql-5.7.43-winx64&#xff0c;并在该目录中创建配置文件my.ini。 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置3306端口 port 3306 # 设置mysql的安装目录 basedirC:…

关于 Ceph 的一些维护工作总结

OSD的状态可能在ceph集群内&#xff08;in&#xff09;或集群外&#xff08;out&#xff09;&#xff0c;也可能处于运行中&#xff08;up&#xff09;或者不运行中&#xff08;down&#xff09;。 OSD处于UP状态时&#xff0c;可能处于集群内&#xff08;in&#xff09;或集群…

常见场景面试题(二)

typora-copy-images-to: imgs theme: cyanosis 敏感词库的设计&#xff0c;要求增删改查敏感词。敏感词文本匹配&#xff0c;敏感词一万个&#xff0c;文本长度在 20 - 1000 答&#xff1a;使用 trie 树来实现敏感词库的设计&#xff0c;可以利用字符串公共前缀来节约存储空间。…