news 2026/9/16 12:11:48

C++中的面向对象编程(OOP)三大特性:封装、继承、多态

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++中的面向对象编程(OOP)三大特性:封装、继承、多态

C++中的面向对象编程(OOP)三大特性:封装、继承、多态

C++ 是支持面向对象编程的语言,其核心特性包括封装(Encapsulation)继承(Inheritance)多态(Polymorphism)。下面逐一详细介绍,并给出完整的可运行代码示例。


1. 封装(Encapsulation)

定义:将数据(属性)和操作数据的方法(函数)打包在一起,对外部隐藏内部实现细节,只暴露必要的接口。

好处

  • 数据保护(防止外部直接修改内部状态)
  • 代码模块化
  • 提高安全性与可维护性

实现方式

  • 使用class(推荐)或struct
  • 访问修饰符:publicprotectedprivate
  • 通过getter/setter控制访问
代码示例
#include<iostream>#include<string>classStudent{private:// 私有成员,外部无法直接访问std::string name;intage;doublescore;public:// 构造函数Student(conststd::string&n,inta,doubles):name(n),age(a),score(s){}// Getterstd::stringgetName()const{returnname;}intgetAge()const{returnage;}doublegetScore()const{returnscore;}// Setter(带验证)voidsetAge(inta){if(a>=0&&a<=150){age=a;}else{std::cout<<"年龄无效!\n";}}voidsetScore(doubles){if(s>=0&&s<=100){score=s;}else{std::cout<<"分数无效!\n";}}// 成员函数voiddisplay()const{std::cout<<"姓名: "<<name<<", 年龄: "<<age<<", 分数: "<<score<<std::endl;}};intmain(){Studentstu("张三",20,85.5);stu.display();stu.setAge(21);stu.setScore(92.0);std::cout<<"更新后: "<<stu.getName()<<" 的分数是 "<<stu.getScore()<<std::endl;return0;}

2. 继承(Inheritance)

定义:子类(派生类)自动获得父类(基类)的成员(属性和方法),实现代码复用。

语法

class派生类:访问修饰符 基类{...};

访问修饰符

  • public:基类 public/protected 成员在派生类中保持原访问级别(最常用)
  • protected:基类 public 成员变为 protected
  • private:基类所有成员在派生类中变为 private

继承方式:单继承、多继承、虚继承(解决菱形继承问题)。

代码示例(单继承 + protected)
#include<iostream>// 基类classPerson{protected:std::string name;intage;public:Person(conststd::string&n,inta):name(n),age(a){}voidintroduce()const{std::cout<<"我是 "<<name<<", "<<age<<"岁。"<<std::endl;}};// 派生类classTeacher:publicPerson{private:std::string subject;public:Teacher(conststd::string&n,inta,conststd::string&sub):Person(n,a),subject(sub){}voidteach()const{std::cout<<name<<" 正在教授 "<<subject<<std::endl;}};intmain(){Teachert("李老师",45,"高等数学");t.introduce();// 继承自基类t.teach();return0;}

3. 多态(Polymorphism)

定义:同一接口,不同实现。体现“一个名字,多种形态”。

C++ 中多态分为两类:

  1. 编译时多态(静态多态):函数重载、运算符重载、模板
  2. 运行时多态(动态多态):虚函数 + 继承 + 基类指针/引用
运行时多态核心:虚函数(virtual)
#include<iostream>// 基类classShape{public:virtualvoiddraw()const{// 虚函数std::cout<<"绘制形状"<<std::endl;}virtualdoublearea()const=0;// 纯虚函数 → 抽象类virtual~Shape()=default;// 虚析构函数(重要!)};// 派生类1classCircle:publicShape{private:doubleradius;public:Circle(doubler):radius(r){}voiddraw()constoverride{std::cout<<"绘制圆形"<<std::endl;}doublearea()constoverride{return3.14159*radius*radius;}};// 派生类2classRectangle:publicShape{private:doublewidth,height;public:Rectangle(doublew,doubleh):width(w),height(h){}voiddraw()constoverride{std::cout<<"绘制矩形"<<std::endl;}doublearea()constoverride{returnwidth*height;}};intmain(){// 基类指针指向派生类对象 → 多态Shape*shapes[2];shapes[0]=newCircle(5.0);shapes[1]=newRectangle(4.0,6.0);for(inti=0;i<2;++i){shapes[i]->draw();// 动态绑定,调用实际类型的方法std::cout<<"面积: "<<shapes[i]->area()<<std::endl<<std::endl;}// 清理deleteshapes[0];deleteshapes[1];return0;}

关键点

  • virtual关键字声明虚函数
  • override(C++11)显式标记重写
  • 必须通过指针或引用调用才能实现运行时多态
  • 基类应有虚析构函数,避免内存泄漏

总结对比

特性主要作用关键关键字/机制使用场景
封装隐藏实现细节privatepublicgetter/setter数据保护、接口设计
继承代码复用:(冒号)、public继承“is-a” 关系
多态统一接口,灵活扩展virtualoverride框架设计、插件系统

面向对象设计原则(SOLID)中,这些特性是基础。实际开发中通常结合抽象类(含纯虚函数)和接口(纯虚函数类)来实现更灵活的设计。

如果你需要多继承虚继承运算符重载模板多态或其他高级示例(如智能指针配合多态),随时告诉我,我可以继续补充!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 12:11:07

用C++与QT构建学生选课管理系统:从数据库设计到界面实战

简介&#xff1a;这是一套基于C与QT开发的学生选课管理系统&#xff0c;面向计算机相关专业、需要完成毕业设计、期末大作业或课程设计的高校学生&#xff0c;也适合刚接触Qt开发的初学者参考。资源包内含完整可运行的源码、数据库脚本和论文资料&#xff0c;功能覆盖学生信息维…

作者头像 李华
网站建设 2026/9/16 12:10:15

LoRA微调LLaMA-2实战:从CUDA注入到Tokenizer对齐的端到端闭环

简介&#xff1a;本资源是一套面向AI开发者与大模型初学者的LLaMA快速微调实战项目&#xff0c;聚焦自然语言处理任务中的模型适配与工程落地&#xff0c;解决预训练大模型如何高效适配垂直场景的核心问题。压缩包共340个文件&#xff0c;涵盖159个Python训练/数据处理脚本、40…

作者头像 李华
网站建设 2026/9/16 12:09:58

Claude Code 报错无法连接 Anthropic?TaoToken 这样改 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/16 12:09:33

飞秒激光与金属相互作用:双温模型与MATLAB数值模拟

1. 飞秒激光与金属相互作用的基础物理模型飞秒激光与金属相互作用是一个典型的非平衡态热力学过程。当超短脉冲激光&#xff08;通常脉宽在10-100飞秒量级&#xff09;照射金属表面时&#xff0c;光子能量首先被电子吸收&#xff0c;由于电子-声子耦合时间尺度&#xff08;约1皮…

作者头像 李华
网站建设 2026/9/16 12:09:08

Pentagi:基于Neo4j与轻量AI Agent的攻击链认知建模系统

1. 项目概述&#xff1a;Pentagi 是什么&#xff1f;它解决的不是“渗透测试自动化”&#xff0c;而是“攻击链认知建模”的根本问题Pentagi 这个名字乍看像拼写错误&#xff0c;实则暗藏玄机——它由Penetration Tagi&#xff08;源自拉丁语tactus&#xff0c;意为“触达”“连…

作者头像 李华