当前位置: 首页 > news >正文

【C++】封装、继承和多态

文章目录

  • 一、封装
  • 二、继承
  • 三、多态

一、封装

通俗来说就是将拥有共同属性和行为的东西封装成一个类,类可以实例化为多个对象,每个对象都具有相同的属性和行为。
比如学生是一个类,每个学生都拥有共同的属性和行为:姓名、学号、家庭地址以及登记信息的行为。
这些属性和行为又可以设定不同的访问权限:公共、保护和私有权限。

class Student{public://公共权限 在类内可以访问,在类外也可以访问string name;protected://保护权限 在类内可以访问,在类外不能访问intxuehao;private://私有权限 在类内可以访问,在类外不能访问string addr;public:voidset(string m_name,intm_xuehao,string addr){//在类内可以访问name=m_name;xuehao=m_xuehao;addr=m_addr;}};//也可初始化列表,改写为://void test(string m_name,int m_xuehao, string addr):name(m_name),xuehao(m_xuehao),addr(m_addr){};intmain(){Student S;//School为类 S为类实例化得到的对象S.set("lili",124,"xi'an");//公有权限,可访问cout<<S.name<<endl;//S.name可访问, S.addr和S.xuehao都不能访问}

Student类中的name、xuehao、addr、set() 统称为类的成员,
其中属性 :name、xuehao、addr 称为成员属性;行为:set()称为成员函数

小tip:
struct 和 class的区别?
struct 的默认权限为公共权限
class 的默认权限为私有权限


二、继承

每个班级的学生都有上面的属性和行为,此时若要将一个班级的学生归为一类,就要在学生这个类的基础上再定义一个班级的类。那么学生就是父类,班级就是子类,子类继承父类的成员。

//仅以继承权限为public为例 若class Banji : protected Student{};或者class Banji : private Student{};情况会有所不同class Banji:public Student{//子类继承父类的属性和行为,public:voidwholetest(string m_name,intm_xuehao,string m_banhao){//考试行为name=m_name;// 父类的公共权限,子类可以访问xuehao=m_xuehao;//父类的保护权限,子类可以访问//addr = m_addr;//父类的私有权限,子类不可访问banhao=m_banhao;//子类的私有权限}private:string banhao;};intmain(){Banji A;//对象AA.set("lili",124,"xi'an");//子类继承父类的成员函数,成员函数set可以访问私有权限的addr,因为set()是属于Student父类,类内可以访问私有权限的成员A.wholetest("lili",124,"3班");cout<<A.name<<endl;//A.name可访问,//A.xuehao不能访问,xuehao是School的保护成员//A.addr不能访问,addr是School的私有成员//A.banhao不能访问,banhao是Banji的私有成员}

三、多态

多态分为两类
静态多态 : 函数重载 和 运算符重载属于静态多态,复用函数名
动态多态 : 派生类和虚函数实现运行时多态

静态多态和动态多态区别:
静态多态的函数地址早绑定 - 编译阶段确定函数地址
动态多态的函数地址晚绑定 - 运行阶段确定函数地址

动态多态满足条件
1、有继承关系
2、子类重写父类的虚函数

现在有A和B两个班级都继承Student类,Student 类里面创建了一个虚函数test(),子类 Banji_A 和Banji_B要在各自的类里重写这个函数test(),test()在两个子类中的内容可能不同,但是可通过 父类的指针或者引用 指向子类对象 来实现动态多态。

class Student{public:virtualvoidtest(){////在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容cout<<"学生考试"<<endl;}};class Banji_A:public Student{//子类继承父类的属性和行为,public:voidtest(){//子类重写父类的虚函数cout<<"A班学生考试"<<endl;}};class Banji_B:public Student{//子类继承父类的属性和行为,public:voidtest(){//子类重写父类的虚函数cout<<"B班学生考试"<<endl;}};// 动态多态使用// 父类的指针或者引用 指向子类对象voiddoTest(Student&s){//父类的引用指向子类s.test();}voidmain(){Banji_A a;doTest(a);//输出"A班学生考试"Banji_B b;doTest(b);//输出"B班学生考试"}/* void doTest(Student *s) { //父类的指针指向子类 s->test(); } void main() { doTest(new Banji_A );//输出"A班学生考试" doTest(new Banji_B); //输出"B班学生考试" }
http://www.jsqmd.com/news/521963/

相关文章:

  • 题解:洛谷 P1948 [USACO08JAN] Telephone Lines S
  • GEENYmodem库:面向tingg.io平台的嵌入式GPRS物联网开发框架
  • granite-4.0-h-350m一文详解:Ollama镜像免配置部署与多场景验证
  • 机房里面一个交换机可以连接多少个主机,如果交换机的接口不够了怎么办
  • 电机控制技术漫谈:Matlab 建模与多种控制策略
  • 【仅限医疗器械开发者】:C语言合规检查自动化流水线搭建(Jenkins+GitLab CI+定制化MISRA规则集)
  • SEO_2024年最有效的SEO策略与方法详解(132 )
  • Llama-3.2V-11B-cot 作品集:多风格艺术画作解读与诗意描述生成
  • Asian Beauty Z-Image Turbo 创意延展:基于单图生成系列化视觉资产
  • Lua时间操作实战:从基础解析到高效应用
  • 实战复现:PbootCMS最新版SQL注入漏洞,从分析到绕过WAF的完整利用链
  • Arduino I2C LCD驱动库:PCF8574与HD44780通信详解
  • MLCC电容并联的隐藏陷阱:为什么你的大小电容组合反而增大了噪声?
  • 网安--Linux基础知识(二)
  • Windows 10下MiKTeX与TeXstudio安装配置全攻略(附PDFLaTeX设置技巧)
  • 从ResNet50样例出发:手把手带你用Atlas 300I Pro推理卡跑通第一个AI应用
  • 计算机领域SCI投稿避坑指南:这8本期刊审稿快、录用率高,适合国内学者
  • windows的hadoop集群环境直接配
  • 【JUC 核心基石】开一家“多线程工厂”,把晦涩的线程调度扒得明明白白!
  • Dify自定义节点异步化落地指南(企业级生产环境实测版):从零配置到高并发稳定运行
  • LangChain入门
  • 搭建Matlab风光柴储混合微电网储能电池系统互补能量管理Simulink模型
  • ControlNet FP16优化终极指南:高效AI图像控制的完整解决方案
  • 从零点亮 RK3568 的 LED:设备树,平台总线,现代gpio子系统全解析(附完整代码)
  • Qwen3-ASR-0.6B多场景:直播实时字幕、短视频配音识别、有声书制作辅助
  • 2026年金华抗起球德绒保暖内衣厂家推荐,好用的有哪些 - mypinpai
  • Tessent Scan 入门完全指南
  • manwa2漫蛙2下载安装图文教程 | 2026漫蛙正版阅读软件详解 - xiema
  • RMBG-1.4抠图效果实测:发丝、宠物毛都能精准分离,太强了
  • 高等数学级数入门:从概念到实战,5个常见级数问题解析