C++封装、继承、多态

本文详细介绍了C++中面向对象的三个基本特征:封装、继承和多态。封装隐藏实现细节,实现代码模块化;继承扩展已有类,实现代码重用;多态则通过接口重用实现不同子类共享同一接口。同时,文章讨论了多态的实现方式,包括覆盖和重载,并分析了C++中多态机制的内存分配和虚表的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

面向对象的三个基本特征

面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!

封装                                               

### C++封装继承多态的概念及用法 #### 封装 (Encapsulation) 封装是一种将数据(属性)和操作这些数据的方法绑定在一起的技术,同时隐藏对象内部的具体实现细节。通过访问控制机制(`public`, `protected`, 和 `private`),可以保护类的数据不被外部随意修改。 以下是封装的一个简单示例: ```cpp class EncapsulationExample { private: int data; // 私有成员变量,无法直接访问 public: void setData(int value) { // 提供公共接口设置私有数据 data = value; } int getData() const { // 提供公共接口获取私有数据 return data; } }; ``` 上述代码展示了如何利用封装技术保护数据的安全性[^1]。 --- #### 继承 (Inheritance) 继承是面向对象编程中的一个重要特性,它允许创建一个新类(派生类或子类)基于已有的类(基类或父类)。这样可以减少冗余代码并提高可维护性。 C++ 支持单继承以及多重继承。然而,在多重继承中可能会遇到“菱形继承”问题,这可以通过定义虚基类来解决[^2]。 下面是一个简单的继承例子: ```cpp // 基类 class Animal { public: void eat() { std::cout << "Eating..." << std::endl; } }; // 派生类 class Dog : public Animal { public: void bark() { std::cout << "Barking..." << std::endl; } }; ``` 在这个例子中,`Dog` 类继承自 `Animal` 类,并扩展了自己的行为——`bark()` 方法。 对于多重继承的情况,考虑如下场景: ```cpp class A {}; class B : virtual public A {}; // 虚拟继承 class C : virtual public A {}; class D : public B, public C {}; int main() { D objD; return 0; } ``` 这里使用了虚拟继承以避免因多次继承而导致的对象重复实例化问题。 --- #### 多态 (Polymorphism) 多态是指同一个接口可以根据调用它的具体对象而表现出不同的形式。在 C++ 中主要分为静态多态性和动态多态性两大类。前者通常由函数重载或者运算符重载实现;后者则依赖于虚函数完成运行时的选择逻辑[^3]。 ##### 动态多态性的典型应用 —— 使用虚函数 当希望某个特定功能能够在不同类型的对象间共享相同的名字却有不同的实际执行效果时,则需要用到虚函数。例如: ```cpp #include <iostream> using namespace std; class Shape { public: virtual void draw() = 0; // 纯虚函数声明 }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle." << endl; } }; class Rectangle : public Shape { public: void draw() override { cout << "Drawing a rectangle." << endl; } }; void displayShape(Shape* shapePtr) { shapePtr->draw(); } int main() { Shape *shapeObj1 = new Circle(); Shape *shapeObj2 = new Rectangle(); displayShape(shapeObj1); // 输出:Drawing a circle. displayShape(shapeObj2); // 输出:Drawing a rectangle. delete shapeObj1; delete shapeObj2; return 0; } ``` 此程序片段说明了即使两个指针指向的是不同类型的实际实体,但由于它们都实现了共同的抽象基础类型所规定的协议,因此能够统一处理[^4]。 --- #### 综合案例分析 综合以上三个概念的应用,我们可以构建更复杂的软件结构模型。比如设计一款游戏引擎框架,其中涉及各种角色及其技能树管理等复杂交互关系,都可以借助 OOP 的三大支柱去简化开发流程并增强系统的灵活性与扩展能力。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PaQiuQiu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值