52继承与组合

简介: 52继承与组合

C++入门——60s从0到1

继承与组合

 

在C++中,继承和组合都是实现代码重用的常见技术。它们可以帮助我们避免重复编写代码,提高代码的复用性和可维护性。

 

继承

 

继承是一种机制,它允许我们定义一个新的类(称为派生类),该类继承自一个现有的类(称为基类)。派生类可以访问基类的成员,包括属性和方法。继承可以让我们在已有的类的基础上构建新的类,而不需要从头开始编写。

 

继承通常用于表示“是一个”关系,即派生类是基类的一种特定类型。例如,如果我们有一个名为 `Animal` 的基类,那么我们可以创建一个名为 `Cat` 的派生类,表示猫是一种动物。

 

#include <iostream>
using namespace std;
 
class Animal {
public:
    void eat() {
        cout << "Animal is eating." << endl;
    }
};
 
class Cat : public Animal {
public:
    void meow() {
        cout << "Meow!" << endl;
    }
};
 
int main() {
    Animal* animal = new Cat();  // 基类指针指向派生类对象
    animal->eat();  // 调用 Animal::eat()
    animal->meow();  // 调用 Cat::meow()
    delete animal;
    return 0;
}

 

在上面的例子中,我们创建了一个 `Cat` 类型的对象,并通过基类指针将其赋值给 `Animal` 类型的指针 `animal`。然后,我们通过 `animal` 调用了 `eat()` 和 `meow()` 函数。需要注意的是,虽然 `animal` 是基类的指针,但是它指向的是一个派生类的对象,所以它可以调用基类和派生类的成员函数。

 

继承的优点是可以减少代码的重复性,同时也可以提高代码的可维护性。但是需要注意的是,过度使用继承可能会导致代码的复杂性增加,因为派生类会继承基类的所有成员,包括一些可能不需要的成员。这可能会导致代码冗余和不必要的开销。

 

组合

 

组合是一种机制,它允许我们将一个类的对象作为一个整体包含在另一个类的对象中。组合通常用于表示“有”关系,即一个对象包含另一个对象。例如,如果我们有一个名为 `Car` 的类,那么我们可以将一个名为 `Engine` 的类作为 `Car` 的一部分来包含进来。

 

#include <iostream>
using namespace std;
 
class Engine {
public:
    void run() {
        cout << "Engine is running." << endl;
    }
};
 
class Car {
public:
    Engine* engine;  // 包含一个 Engine 的指针
    Car(Engine& engine) : engine(&engine) {}  // 将 Engine 的引用传递给 Car 的构造函数
    void drive() {
        engine->run();  // 调用 Engine::run()
    }
};
 
int main() {
    Engine engine;  // 创建一个 Engine 对象
    Car car(engine);  // 将 Engine 的引用传递给 Car 的构造函数
    car.drive();  // 调用 Car::drive() 和 Engine::run()
    return 0;
}

在上面的例子中,我们创建了一个 `Engine` 类型的对象和一个 `Car` 类型的对象。然后我们将 `Engine` 的引用传递给了 `Car` 的构造函数,这样就可以在 `Car` 中使用 `Engine` 的成员函数了。通过这种方式,我们可以将多个独立的类组合成一个更复杂的对象。组合的优点是可以提高代码的可维护性和可扩展性,因为它可以将相关的功能组织在一起,并减少代码的重复性。但是需要注意的是,组合可能会导致对象之间的依赖关系变得更加复杂,因此需要谨慎使用。

目录
相关文章
|
JavaScript 数据安全/隐私保护 UED
UniApp 中的路由魔法:玩转页面导航与跳转
UniApp 中的路由魔法:玩转页面导航与跳转
2159 3
|
10月前
|
存储 算法 API
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
【01】整体试验思路,如何在有UID的情况下获得用户手机号信息,python开发之理论研究试验,如何通过抖音视频下方的用户的UID获得抖音用户的手机号-本系列文章仅供学习研究-禁止用于任何商业用途-仅供学习交流-优雅草卓伊凡
1579 82
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在客服领域有哪些应用?
人工智能正在彻底改变着传统客服行业,它不仅拓展了业务边界,还推动着整个行业向更高效、更人性化方向迈进。
752 7
|
9月前
|
人工智能 JSON 自然语言处理
31.3K star!开源免费本地AI神器,一键部署多模态大模型!
LocalAI 是一款革命性的开源AI框架,专为本地化部署设计。它完美复现了OpenAI的API接口,支持运行各类开源大模型(如LLaMA3、Phi-2、Stable Diffusion等),无需GPU即可在普通电脑上实现:
699 0
|
Linux Android开发 iOS开发
深入探索Android与iOS的多任务处理机制
在移动操作系统领域,Android和iOS各有千秋,尤其在多任务处理上展现出不同的设计理念和技术实现。本文将深入剖析两大平台在后台管理、资源分配及用户体验方面的策略差异,揭示它们如何平衡性能与电池寿命,为用户带来流畅而高效的操作体验。通过对比分析,我们不仅能够更好地理解各自系统的工作机制,还能为开发者优化应用提供参考。
|
SQL 安全 数据库
如何安装和配置Navicat?
【8月更文挑战第28天】如何安装和配置Navicat?
1199 7
|
前端开发 JavaScript 安全
前端JS实现密码校验键盘横竖、26字母、相同字母、相同数字、密码包含用户名、数字 字母不能连续 不能相同三个、不能横向 竖向 连续三个 包含字符、不能有中文符号
该 JavaScript 代码实现了一个严格的密码校验功能,确保密码满足多种安全要求,包括长度、字符类型、不包含中文及特殊字符、不与用户名相似等。通过多个辅助函数,如 `validateFormat` 检查密码格式,`isHasChinaCharFun` 检测中文符号,`getCharAll` 生成键盘组合,以及 `checkPasswordFun` 综合验证密码的有效性和安全性。此工具对于提高用户账户的安全性非常有用。
648 0
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
362 0
|
机器学习/深度学习 算法 数据挖掘
【机器学习】为什么K-means算法使用欧式距离度量?
【5月更文挑战第11天】【机器学习】为什么K-means算法使用欧式距离度量?
|
存储 资源调度 前端开发
【React | 完整项目创建流程】能看到这么详细的React配置流程,就偷着乐吧!
【React | 完整项目创建流程】能看到这么详细的React配置流程,就偷着乐吧!
415 1