面向对象三大特性深度解析:封装、继承与多态

思维导图概览

面向对象三大特性
封装
继承
多态
访问控制
数据隐藏
继承类型
构造/析构顺序
菱形继承问题
静态多态
动态多态
函数重载
运算符重载
虚函数
纯虚函数
抽象类

目录

  1. 封装:数据与行为的统一
  2. 继承:代码复用的艺术
    • 继承类型与访问控制
    • 构造与析构顺序
    • 菱形继承解决方案
  3. 多态:同一接口的多种实现
    • 静态多态(重载与运算符重载)
    • 动态多态(虚函数与抽象类)
  4. 友元机制:打破封装边界
  5. 综合应用实例

1. 封装:数据与行为的统一

封装是将数据(成员变量)和操作数据的方法(成员函数)捆绑在一起的机制,通过访问控制实现数据隐藏。

class BankAccount {
private:  // 封装敏感数据string accountNumber;double balance;public:   // 公开接口BankAccount(string accNum, double initBalance) : accountNumber(accNum), balance(initBalance) {}void deposit(double amount) {if (amount > 0) balance += amount;}bool withdraw(double amount) {if (amount > 0 && balance >= amount) {balance -= amount;return true;}return false;}double getBalance() const { return balance; }
};// 使用示例
BankAccount myAccount("123456789", 1000.0);
myAccount.deposit(500.0);
bool success = myAccount.withdraw(200.0);
cout << "Current balance: " << myAccount.getBalance();

输出结果:

Current balance: 1300.0

2. 继承:代码复用的艺术

继承类型与访问控制

继承方式基类public成员基类protected成员基类private成员
publicpublicprotected不可访问
protectedprotectedprotected不可访问
privateprivateprivate不可访问
class Animal {  // 基类
protected:string name;public:Animal(string n) : name(n) {}void eat() { cout << name << " is eating." << endl; }
};class Dog : public Animal {  // public继承
public:Dog(string n) : Animal(n) {}void bark() { cout << name << " says: Woof! Woof!" << endl;  // 可访问基类protected成员}
};// 使用示例
Dog myDog("Buddy");
myDog.eat();   // 继承自基类
myDog.bark();  // 派生类自有方法

输出结果:

Buddy is eating.
Buddy says: Woof! Woof!

构造与析构顺序

  • 构造顺序:基类 → 派生类
  • 析构顺序:派生类 → 基类
class Base {
public:Base() { cout << "Base constructor" << endl; }~Base() { cout << "Base destructor" << endl; }
};class Derived : public Base {
public:Derived() { cout << "Derived constructor" << endl; }~Derived() { cout << "Derived destructor" << endl; }
};// 使用示例
{Derived obj;
}

输出结果:

Base constructor
Derived constructor
Derived destructor
Base destructor

菱形继承解决方案

class Person {
public:string name;Person(string n) : name(n) {}
};// 虚继承解决菱形继承问题
class Student : virtual public Person {
public:int studentId;Student(string n, int id) : Person(n), studentId(id) {}
};class Teacher : virtual public Person {
public:string department;Teacher(string n, string dept) : Person(n), department(dept) {}
};class TA : public Student, public Teacher {
public:TA(string n, int id, string dept) : Person(n), Student(n, id), Teacher(n, dept) {}  // 直接初始化虚基类
};

3. 多态:同一接口的多种实现

静态多态(编译时)

函数重载
class Calculator {
public:int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }string add(string a, string b) { return a + b; }
};// 使用示例
Calculator calc;
cout << calc.add(5, 3) << endl;
cout << calc.add(2.5, 3.7) << endl;
cout << calc.add("Hello, ", "World!") << endl;

输出结果:

8
6.2
Hello, World!
运算符重载
class Vector2D {
public:float x, y;Vector2D(float x, float y) : x(x), y(y) {}// 成员函数形式重载+Vector2D operator+(const Vector2D& other) const {return Vector2D(x + other.x, y + other.y);}// 友元函数形式重载<<friend ostream& operator<<(ostream& os, const Vector2D& v);
};ostream& operator<<(ostream& os, const Vector2D& v) {os << "(" << v.x << ", " << v.y << ")";return os;
}// 使用示例
Vector2D v1(1.0f, 2.0f);
Vector2D v2(3.0f, 4.0f);
Vector2D v3 = v1 + v2;
cout << v1 << " + " << v2 << " = " << v3;

输出结果:

(1, 2) + (3, 4) = (4, 6)

动态多态(运行时)

虚函数与重写
class Shape {
public:virtual void draw() const {  // 虚函数cout << "Drawing a generic shape" << endl;}virtual double area() const = 0;  // 纯虚函数
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}void draw() const override {  // 重写基类虚函数cout << "Drawing a circle with radius " << radius << endl;}double area() const override {return 3.14159 * radius * radius;}
};// 使用多态
void drawShape(const Shape& shape) {shape.draw();cout << "Area: " << shape.area() << endl;
}// 使用示例
Circle circle(5.0);
drawShape(circle);

输出结果:

Drawing a circle with radius 5
Area: 78.5397
抽象类
class Animal {
public:virtual void makeSound() const = 0;  // 纯虚函数
};class Dog : public Animal {
public:void makeSound() const override {cout << "Woof! Woof!" << endl;}
};class Cat : public Animal {
public:void makeSound() const override {cout << "Meow!" << endl;}
};// 使用示例
Animal* animals[] = {new Dog(), new Cat()};
for (Animal* animal : animals) {animal->makeSound();
}

输出结果:

Woof! Woof!
Meow!

4. 友元机制:打破封装边界

class SecretData {
private:int secretCode;string secretMessage;public:SecretData(int code, string msg) : secretCode(code), secretMessage(msg) {}// 声明友元函数friend void displaySecret(const SecretData&);// 声明友元类friend class SecretAccessor;
};// 友元函数实现
void displaySecret(const SecretData& data) {cout << "Code: " << data.secretCode << ", Message: " << data.secretMessage << endl;
}// 友元类实现
class SecretAccessor {
public:void modifySecret(SecretData& data, int newCode, string newMsg) {data.secretCode = newCode;data.secretMessage = newMsg;}
};// 使用示例
SecretData data(123, "Top Secret");
displaySecret(data);  // 友元函数访问私有成员SecretAccessor accessor;
accessor.modifySecret(data, 456, "New Secret");
displaySecret(data);

输出结果:

Code: 123, Message: Top Secret
Code: 456, Message: New Secret

5. 综合应用实例

class Vehicle {
protected:string brand;int year;public:Vehicle(string b, int y) : brand(b), year(y) {}virtual void displayInfo() const {cout << brand << " (" << year << ")";}virtual void startEngine() const = 0;
};class Car : public Vehicle {
private:int doors;public:Car(string b, int y, int d) : Vehicle(b, y), doors(d) {}void displayInfo() const override {cout << "Car: ";Vehicle::displayInfo();cout << ", Doors: " << doors << endl;}void startEngine() const override {cout << "Car engine started: Vroom Vroom!" << endl;}
};class Truck : public Vehicle {
private:double payload;public:Truck(string b, int y, double p) : Vehicle(b, y), payload(p) {}void displayInfo() const override {cout << "Truck: ";Vehicle::displayInfo();cout << ", Payload: " << payload << " tons" << endl;}void startEngine() const override {cout << "Truck engine started: RUMBLE RUMBLE!" << endl;}
};// 使用示例
Vehicle* garage[] = {new Car("Toyota", 2022, 4),new Truck("Ford", 2020, 5.5)
};for (Vehicle* v : garage) {v->displayInfo();v->startEngine();cout << endl;
}

输出结果:

Car: Toyota (2022), Doors: 4
Car engine started: Vroom Vroom!Truck: Ford (2020), Payload: 5.5 tons
Truck engine started: RUMBLE RUMBLE!

总结思维导图

面向对象核心
封装
继承
多态
数据隐藏
访问控制
代码复用
类层次
接口统一
实现多样
函数重载
运算符重载
虚函数
抽象类

关键要点回顾:

  1. 封装是面向对象的基础,通过访问控制实现数据保护
  2. 继承提高代码复用率,注意构造/析构顺序和访问控制
  3. 多态分为静态(编译时)和动态(运行时)两种形式
  4. 虚函数实现运行时多态,纯虚函数定义接口规范
  5. 友元机制谨慎使用,它打破了封装边界
  6. 运算符重载使自定义类型具有内置类型的行为
  7. 菱形继承问题通过虚继承解决

掌握面向对象三大特性,能够设计出更加灵活、可扩展和可维护的软件系统,是每个C++开发者必须精通的核心理念。


原创技术笔记,转载需注明出处。更多系统编程内容持续更新中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86832.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86832.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/86832.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mmap映射物理内存之三invalid cache

目录 流程设计 invalid 命令 内核态invalid 内核态invalid&#xff0c;用户态mmap物理地址 PAN机制 PAN机制历程 硬件支持 ARMv8.1-PAN 特性 Linux 内核的适配 软件模拟 PAN&#xff08;SW PAN&#xff09; 背景 Linux 的实现 总结 前述刷新cache的流程也同样可…

记忆化搜索(dfs+memo)无环有向图

这是一道可以当作板子的极简记忆化搜索 建立a 是邻接表&#xff0c;其中 a[x] 存储从节点 x 出发能到达的所有节点。 b[x] 记录从节点 x 出发的所有边的权重之和。根据数学原理&#xff0c;我们很容易发现&#xff0c;一个根&#xff08;起点&#xff09;的期望&#xff0c;等…

使用AI豆包写一个车辆信息管理页面

记录一个基本的车辆信息管理页面&#xff0c;由豆包撰写完成&#xff0c;只需要微调页面即可。 主要功能是车辆信息的查询、新增、编辑&#xff0c;项目用到了uniapp、vue3、ts、uni-ui、z-paging 页面效果如下&#xff1a; 以上界面均由豆包生成&#xff0c;完成度非常高&am…

《HarmonyOSNext应用防崩指南:30秒定位JS Crash的破案手册》

《HarmonyOSNext应用防崩指南&#xff1a;30秒定位JS Crash的破案手册》 ##Harmony OS Next ##Ark Ts ##教育 本文适用于教育科普行业进行学习&#xff0c;有错误之处请指出我会修改。 &#x1f4a5; 哇哦&#xff01;JS Crash崩溃日志完全解析手册 当你的应用突然闪退时&am…

阅读笔记(3) 单层网络:回归(下)

阅读笔记(3) 单层网络:回归(下) 该笔记是DataWhale组队学习计划&#xff08;共度AI新圣经&#xff1a;深度学习基础与概念&#xff09;的Task03 以下内容为个人理解&#xff0c;可能存在不准确或疏漏之处&#xff0c;请以教材为主。 1. 为什么书上要提到决策理论&#xff1f; …

Mac OS系统每次开机启动后,提示:输入密码来解锁磁盘“Data”,去除提示的解决方法

问题描述&#xff1a; Mac mini外接了一个磁盘&#xff08;EX_Mac&#xff09;为默认使用的系统盘&#xff0c;内置的硬盘&#xff08;Macintosh HD&#xff09;为Mac mini自带的系统盘 外置硬盘系统每次开机都会挂载内置磁盘&#xff0c;同时会提示需要输入密码来解锁磁盘“…

CSS Flex 布局中flex-shrink: 0使用

flex-shrink: 0 是 CSS Flexbox 布局中的一个关键属性&#xff0c;用于禁止弹性项目&#xff08;flex item&#xff09;在容器空间不足时被压缩。以下是详细解释和示例&#xff1a; 核心作用 当容器的可用空间小于所有弹性项目的总宽度&#xff08;或高度&#xff09;时&#…

WHERE 子句中使用子查询:深度解析与最佳实践

&#x1f50d; WHERE 子句中使用子查询&#xff1a;深度解析与最佳实践 在 WHERE 子句中使用子查询是 SQL 的高阶技巧&#xff0c;可实现动态条件过滤。以下是全面指南&#xff0c;涵盖语法、类型、陷阱及优化策略&#xff1a; &#x1f4dc; 一、基础语法结构 SELECT 列 FR…

从0到1:不文明现象随手拍小程序开发日记(一)

前期调研 不文明现象随手拍小程序&#xff1a;在城市的快速发展进程中&#xff0c;不文明现象时有发生&#xff0c;为了有效解决这一问题&#xff0c;提升城市文明程度&#xff0c; 市民若发现不文明行为&#xff0c;如乱扔垃圾、随地吐痰、破坏公共设施、违规停车等&#xff…

STM32F103之SPI软件读写W25Q64

一、W25Q64简介 1.1 简介 W25Q64(Nor flash)、 24位地址&#xff0c;64Mbit/8MByte、是一种低成本、小型化、使用简单的非易失性存储器&#xff0c;常用于数据存储、字库存储、固件程序存储等场景 时钟频率&#xff1a;最大80MHz(STM32F103系统时钟为72MHz…

vue3+element-plus 组件功能实现 上传功能

一、整体功能概述 这段代码实现了一个基于 Vue 3 和 Element Plus 组件库的文件导入及预览功能模块。主要包含了一个主导入对话框&#xff08;用于上传文件、展示文件相关信息、进行导入操作等&#xff09;以及一个用于预览文件内容的预览对话框。支持导入特定格式&#xff08;…

OpenCV中创建Mat对象

第1章 创建Mat对象 1.1. 创建空的 Mat 对象 cv::Mat mat; 1.2. 创建灰度图像 // 创建一个 3 行 4 列、8位无符号单通道矩阵&#xff08;相当于灰度图&#xff09; cv::Mat mat(3, 4, CV_8UC1); 1.3. 创建彩色图像 // 创建三通道矩阵&#xff08;相当于彩色图像&#xff0…

10、做中学 | 五年级下期 Golang循环控制

一、一个小需求 我想要打印10遍hello world,你想怎么编写呢&#xff1f; // 需求&#xff1a;打印10遍"hello world"fmt.Println("hello world")fmt.Println("hello world")fmt.Println("hello world")fmt.Println("hello world…

机器学习算法-K近邻算法-KNN

1. K近邻算法是什么&#xff1f; 定义&#xff1a; K近邻是一种基于实例的懒惰学习&#xff08;Lazy Learning&#xff09;算法&#xff0c;用于分类和回归任务。 核心思想&#xff1a;“物以类聚”——通过计算样本间的距离&#xff0c;找到目标点的最近K个邻居&#xff0c;…

基于vue框架的法律知识咨询普及系统gwuv7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,知识类型,律师,律师推荐,法律知识,新闻类型,法律新闻,咨询律师 开题报告内容 基于Vue框架的法律知识咨询普及系统开题报告 一、研究背景与意义 随着法治社会建设的深入推进&#xff0c;公众对法律知识的需求呈现爆发式增长。然而…

Netty 揭秘CompositeByteBuf:零拷贝优化核心技术

CompositeByteBuf 类 核心设计目标​​ ​​虚拟缓冲区​​&#xff1a;将多个 ByteBuf 合并为单一逻辑视图&#xff0c;减少数据复制。​​零拷贝优化​​&#xff1a;通过组合而非复制提升性能。​​引用计数管理​​&#xff1a;统一管理底层 ByteBuf 的生命周期。 核心成…

用css实现文字字体颜色渐变

用css实现文字字体颜色渐变 background-clip 是CSS3中新增的属性&#xff0c;可以用于指定背景图片或颜色的绘制范围。利用 background-clip 属性实现文字颜色从左到右、从绿到白的渐变效果&#xff1a; 代码如下&#xff1a; .gradient-color {background-image: linear-gr…

SpringBatch处理数据性能优化

SpringBatch的Step默认使用同步方式批量处理数据&#xff0c;也可以通过配置将读数改为同步&#xff0c;处理和写入改为异步方式。 1、同步处理Step SpringBatch的Step一般由ItemReader、ItemProcessor和ItemWriter组成&#xff0c;其中ItemProcessor是可选的。他的设计思路的…

【机器学习深度学习】前馈神经网络(单隐藏层)

目录 一、什么是前馈神经网络&#xff1f; 二、数学表达式是什么&#xff1f; 三、为什么需要“非线性函数”&#xff1f; 四、NumPy 实现前馈神经网络代码示例 五、 运行结果 六、代码解析 6.1 初始化部分 6.2 前向传播 6.3 计算损失&#xff08;Loss&#xff09; 6…

设计模式系列(08):创建型模式 - 原型模式

系列导读&#xff1a;完成创建型模式的学习&#xff0c;我们来看最后一个创建型模式——原型模式。它通过复制已有对象来创建新对象&#xff0c;是一种独特的创建方式。 解决什么问题&#xff1a;通过复制现有对象来创建新对象&#xff0c;而不是重新实例化。适用于对象创建成本…