C++代码重用:继承与组合的比较

这篇具有很好参考价值的文章主要介绍了C++代码重用:继承与组合的比较。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 C++代码重用:继承与组合的比较,C++的学习笔记,c++,开发语言

目录

一、简介

继承

组合

二、继承

三、组合

四、案例说明

4.1一个电子商务系统

4.1.1继承方式

在上述代码中,Order类继承自User类。通过继承,Order类获得了User类的成员函数和成员变量,并且可以添加自己的特性。我们重写了displayInfo()函数,以便在Order类中显示订单相关信息。4.1.2组合方式


一、简介

当涉及到代码重用时,继承和组合是两种常见的机制。下面将更详细地介绍它们的特点、使用方式以及各自的优缺点。

  1. 继承

    • 特点:继承是一种创建新类的方式,通过继承已有类的属性和方法来构建新类。在继承关系中,子类(也称为派生类)继承了父类(也称为基类)的成员变量和成员函数,并且可以添加自己的特性。
    • 使用方式:在C++中,可以使用classstruct关键字定义类,在定义派生类时,使用冒号:指定继承关系。在继承中,派生类可以访问父类的公有成员,但不能访问私有成员。
    • 优点:
      • 代码重用:通过继承可以重用基类的代码,减少重复编写相似代码的工作量。
      • 层次结构:继承可以创建一个层次结构,通过将类组织成父子关系,可以更好地组织和管理代码。
    • 缺点:
      • 紧耦合:继承会在派生类和基类之间创建紧密的依赖关系,如果基类发生变化,可能会影响到所有的派生类。
      • 多继承问题:多继承可能引发命名冲突和复杂性增加的问题,需要小心处理。
  2. 组合

    • 特点:组合是一种通过在一个类中包含另一个类的对象来实现代码重用的机制。在组合关系中,一个类(称为组合类)包含另一个类(称为成员类)的对象作为成员变量,通过调用成员对象的方法来实现自己的功能。
    • 使用方式:在C++中,可以在组合类中声明成员对象作为成员变量,并在组合类的方法中调用成员对象的方法来实现功能。
    • 优点:
      • 松耦合:组合关系比继承关系更加松散,类之间的依赖关系相对较弱,修改一个类不会影响到其他类。
      • 灵活性:组合允许动态地改变成员对象,可以在运行时替换成员对象,提供更大的灵活性。
    • 缺点:
      • 冗余代码:组合可能导致一些重复代码,需要在组合类中转发成员对象的方法。
      • 对象管理:组合类需要负责创建和管理成员对象,增加了额外的工作量。

在选择使用继承还是组合时,需要考虑以下因素:

  • 类的关系:如果存在一种“is-a”的关系,即派生类是基类的一种特殊形式,可以选择使用继承。例如,Dog可以被视为Animal的一种特殊类型。
  • 代码重用程度:如果需要重用大量基类代码,可以选择继承。继承允许派生类直接使用基类的功能,减少了代码编写的工作量。
  • 灵活性要求:如果需要更灵活的类关系和低耦合度,可以选择组合。组合允许动态替换成员对象,提供更大的灵活性。

二、继承

继承是一种通过创建一个新类来继承已有类的属性和方法的机制。在继承关系中,子类(派生类)可以继承父类(基类)的成员变量和成员函数,并且可以添加自己的特性。下面是一个简单的示例:

#include <iostream>

class Animal {
public:
    void eat() {
        std::cout << "Animal is eating." << std::endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        std::cout << "Dog is barking." << std::endl;
    }
};

int main() {
    Dog dog;
    dog.eat();  // 输出 "Animal is eating."
    dog.bark(); // 输出 "Dog is barking."

    return 0;
}

在这个示例中,我们定义了一个基类Animal和一个派生类Dog。派生类Dog继承了基类Animaleat方法,并添加了自己的bark方法。通过创建Dog对象,我们可以调用继承的eat方法和派生类自己的bark方法。

优点:

  1. 代码重用:继承允许派生类重用基类的代码,避免了重复编写相似的代码。
  2. 层次结构:继承可以创建一个层次结构,通过将类组织成父子关系,可以更好地组织和管理代码。

缺点:

  1. 紧耦合:继承会在派生类和基类之间创建紧密的依赖关系,如果基类发生变化,可能会影响到所有的派生类。
  2. 多继承问题:多继承可能会引发命名冲突和复杂性增加的问题。

三、组合

组合是一种通过在一个类中包含另一个类的对象来实现代码重用的机制。在组合关系中,一个类(组合类)包含另一个类(成员类)的对象作为成员变量。下面是一个示例:

#include <iostream>

class Engine {
public:
    void start() {
        std::cout << "Engine is starting." << std::endl;
    }
};

class Car {
private:
    Engine engine;

public:
    void start() {
        engine.start();
        std::cout << "Car is starting." << std::endl;
    }
};

int main() {
    Car car;
    car.start(); // 输出 "Engine is starting." 和 "Car is starting."

    return 0;
}

在这个示例中,我们定义了一个成员类Engine和一个组合类Car。组合类Car包含一个Engine对象作为成员变量,并通过调用Engine对象的方法实现自己的功能。

优点:

  1. 松耦合:组合关系比继承关系更加松散,类之间的依赖关系相对较弱,修改一个类不会影响到其他类。
  2. 灵活性:组合允许动态地改变成员对象,可以在运行时替换成员对象,提供更大的灵活性。

缺点:

  1. 冗余代码:组合可能导致一些重复代码,需要在组合类中转发成员对象的方法。
  2. 对象管理:组合类需要负责创建和管理成员对象,增加了额外的工作量。

结论: 继承和组合都是C++中常用的代码重用机制,它们各有优缺点。在选择使用哪种机制时,需要根据具体的需求和设计要求进行权衡。如果需要创建一个层次结构或者重用大量基类代码,可以选择继承;如果需要更灵活的类关系和低耦合度,可以选择组合。重要的是根据实际情况选择适合的代码重用方式,并结合良好的设计原则来编写高质量的代码。

四、案例说明

4.1一个电子商务系统

其中有两个重要的类:User(用户)和Order(订单)。用户可以下订单,并且一个用户可以有多个订单,因此User类和Order类之间存在一种关系。我们将使用继承和组合两种方式来设计这两个类之间的关系。

4.1.1继承方式

#include <iostream>
#include <string>

// 用户类
class User {
private:
    std::string name;
public:
    User(const std::string& name) : name(name) {}

    void setName(const std::string& newName) {
        name = newName;
    }

    std::string getName() const {
        return name;
    }

    virtual void displayInfo() const {
        std::cout << "User: " << name << std::endl;
    }
};

// 订单类,继承自用户类
class Order : public User {
private:
    std::string orderId;
public:
    Order(const std::string& name, const std::string& orderId)
        : User(name), orderId(orderId) {}

    void setOrderId(const std::string& newOrderId) {
        orderId = newOrderId;
    }

    std::string getOrderId() const {
        return orderId;
    }

    void displayInfo() const override {
        std::cout << "User: " << getName() << ", OrderId: " << orderId << std::endl;
    }
};

int main() {
    User user("John");
    Order order("John", "12345");

    user.displayInfo();
    order.displayInfo();

    return 0;
}

在上述代码中,Order类继承自User类。通过继承,Order类获得了User类的成员函数和成员变量,并且可以添加自己的特性。我们重写了displayInfo()函数,以便在Order类中显示订单相关信息。4.1.2组合方式

#include <iostream>
#include <string>

// 用户类
class User {
private:
    std::string name;
public:
    User(const std::string& name) : name(name) {}

    void setName(const std::string& newName) {
        name = newName;
    }

    std::string getName() const {
        return name;
    }

    void displayInfo() const {
        std::cout << "User: " << name << std::endl;
    }
};

// 订单类,组合了用户类对象
class Order {
private:
    std::string orderId;
    User user;
public:
    Order(const std::string& name, const std::string& orderId)
        : user(name), orderId(orderId) {}

    void setOrderId(const std::string& newOrderId) {
        orderId = newOrderId;
    }

    std::string getOrderId() const {
        return orderId;
    }

    void displayInfo() const {
        std::cout << "User: " << user.getName() << ", OrderId: " << orderId << std::endl;
    }
};

int main() {
    User user("John");
    Order order("John", "12345");

    user.displayInfo();
    order.displayInfo();

    return 0;
}

在这个例子中,Order类包含了一个User类的对象作为成员变量。通过组合,Order类可以调用User类的方法来处理用户相关的操作。

总结: 在这个案例中,我们展示了继承和组合两种不同的代码重用方式。继承适用于存在"是一种"关系的类,并且可以直接使用基类的成员函数和成员变量。组合适用于存在"有一个"关系的类,其中一个类作为另一个类的成员变量,通过调用成员对象的方法来实现功能。选择使用继承还是组合取决于具体的需求和设计目标,需要权衡各自的优缺点来做出决策。文章来源地址https://www.toymoban.com/news/detail-813663.html

到了这里,关于C++代码重用:继承与组合的比较的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++学习笔记-代码规范合集

    1. C++技巧 头文件扩展名包括“.h”、“.hpp”、“hxx”,源文件扩展名包括“.c”、“.cpp”、“cxx”。 关于改名。比如想将在Visual Studio中将某个函数/类的名字重新修改一下,一个一个改就很麻烦。若为函数,可以直接在函数名上右键“快速操作与重构”;若为类,可以直接在

    2024年02月13日
    浏览(39)
  • C++ 多级继承与多重继承:代码组织与灵活性的平衡

    多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。 在 C++ 中,使用 : 符号来指定继承关系。多级继承的语法如下: 在这个例子中, DerivedClass 从 BaseClass1 和 BaseClass2 继承。这意味着它将继承这两

    2024年04月25日
    浏览(35)
  • DSP TMS320F2803x、TMS320F2806x COMP比较器模块开发笔记(代码基于TMS320F28069 详解)

    比较器模块是一个真正的模拟电压比较器在VDDA领域。核心模拟电路包括比较器,它的输入和输出,以及内部的DAC参考。支持的数字电路包括DAC控制、与其他片上逻辑的接口、输出确认块和可编程控制信号。 比较器块可以监视两个外部模拟输入,或者使用内部DAC引用监视另一

    2024年02月13日
    浏览(37)
  • 【c++】“谁想继承我的花呗-.-“继承的学习

        文章目录 前言 一、继承的语法 二、基类和派生类对象赋值转换 1.例子 2.继承中的作用域 3.派生类的默认成员 4.继承与友元 5.继承与静态成员 6.复杂的菱形继承和菱形虚拟继承 总结   继承 (inheritance)机制是面向对象程序设计 使代码可以复用 的最重要的手段,它允许程序

    2023年04月16日
    浏览(32)
  • 【C++学习】继承

    🐱作者:一只大喵咪1201 🐱专栏:《C++学习》 🔥格言: 你只管努力,剩下的交给时间! C++是面向对象的编程语言,它有很多的特性,但是最重要的就是封装,继承,多态三大特性,封装本喵就不介绍了,前面我们一直都在使用,这里本喵来详细介绍 继承 。 继承:是面向

    2023年04月09日
    浏览(34)
  • C++学习:类继承

    面相对象的主要目的之一就是提供可重用的代码。 类继承就是从已有的类派生出新的类,而派生类继承了原有类,也就是基类的特征和成员函数。 继承一笔财富比自己白手起家要简单的多,写代码也是一样。 下面是可通过继承来外城的工作: 1、可以在已有类的基础上添加

    2024年02月08日
    浏览(38)
  • 继承(个人学习笔记黑马学习)

    继承方式一共有三种: 公共继承 保护继承 私有继承 菱形继承概念 : 两个派生类继承同一个基类 又有某个类同时继承者两个派生类 这种继承被称为菱形继承,或者钻石继承

    2024年02月09日
    浏览(45)
  • c++开发模式,组合模式

    组合模式,顾名思义,通过组合关系定义类间的关联关系,实现了将对象组合成树形结构,最终实现类的复用。可能是由于设计模式看的多了,初看组合模式的类图,感觉和装饰者模式类图很相似,都是使用继承和组合关系,当然,也只是结构相似而已。

    2024年02月14日
    浏览(34)
  • js继承的几种方式(原型链继承、构造函数继承、组合式继承、寄生组合式继承、ES6的Class类继承)

    实现原理: 子类的原型指向父类实例 。子类在自身实例上找不到属性和方法时去它父类实例(父类实例和实例的原型对象)上查找,从而实现对父类属性和方法的继承 缺点: 子类创建时不能传参(即没有实现super()的功能); 父类实例的修改会影响子类所有实例 实现原理:

    2024年02月07日
    浏览(48)
  • 【C++学习手札】一文带你初识C++继承

                                                                                      食用指南:本文在有C基础的情况下食用更佳                                           🍀 本文前置知识:  C++类                           

    2024年02月12日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包