C++ 面向对象程序设计 写一个杂志订阅管理系统,有3组继承关系 代码中包含不少于五个知识点:静态成员,运算符重载,类对象的赋值规则,虚函数或纯虚函数,深拷贝,子对象,全局函数

时间: 2024-02-28 22:56:22 浏览: 21
好的,我来为您解答这个问题。 以下是一个简单的杂志订阅管理系统,它演示了C++的面向对象编程中的一些重要概念,包括静态成员、运算符重载、类对象的赋值规则、虚函数或纯虚函数、深拷贝、子对象和全局函数。 ```cpp #include <iostream> #include <string> using namespace std; // 基类 Magazine class Magazine { public: Magazine(int id, const string& name) : m_id(id), m_name(name) {} virtual void print() const { cout << "Magazine " << m_id << ": " << m_name << endl; } int getID() const { return m_id; } const string& getName() const { return m_name; } private: int m_id; string m_name; }; // 派生类 MonthlyMagazine class MonthlyMagazine : public Magazine { public: MonthlyMagazine(int id, const string& name, int year, int month) : Magazine(id, name), m_year(year), m_month(month) {} virtual void print() const override { cout << "Monthly Magazine " << getID() << ": " << getName() << " (" << m_year << "-" << m_month << ")" << endl; } private: int m_year; int m_month; }; // 派生类 WeeklyMagazine class WeeklyMagazine : public Magazine { public: WeeklyMagazine(int id, const string& name, int week) : Magazine(id, name), m_week(week) {} virtual void print() const override { cout << "Weekly Magazine " << getID() << ": " << getName() << " (Week " << m_week << ")" << endl; } private: int m_week; }; // 订阅类 Subscription class Subscription { public: Subscription() : m_magazine(nullptr), m_count(0) {} Subscription(const Subscription& other) { m_magazine = other.m_magazine; m_count = other.m_count; if (m_magazine) { m_magazine->addSubscriber(); } } Subscription& operator=(const Subscription& other) { if (this != &other) { if (m_magazine) { m_magazine->removeSubscriber(); } m_magazine = other.m_magazine; m_count = other.m_count; if (m_magazine) { m_magazine->addSubscriber(); } } return *this; } virtual ~Subscription() { if (m_magazine) { m_magazine->removeSubscriber(); m_magazine = nullptr; } } void subscribe(Magazine* magazine) { if (m_magazine) { m_magazine->removeSubscriber(); } m_magazine = magazine; m_count = 1; if (m_magazine) { m_magazine->addSubscriber(); } } void unsubscribe() { if (m_magazine) { m_magazine->removeSubscriber(); m_magazine = nullptr; m_count = 0; } } void print() const { if (m_magazine) { m_magazine->print(); cout << "Subscribers: " << m_magazine->getSubscriberCount() << endl; cout << "Total Cost: " << getTotalCost() << endl; } } double getTotalCost() const { if (m_magazine) { return m_count * m_magazine->getPrice(); } else { return 0.0; } } friend ostream& operator<<(ostream& os, const Subscription& subscription) { os << "Subscription: "; if (subscription.m_magazine) { os << subscription.m_magazine->getName() << " (" << subscription.m_count << ")"; } else { os << "None"; } return os; } private: Magazine* m_magazine; int m_count; }; // 静态成员,每个杂志都有自己的价格 class MagazinePrice { public: static double getMonthlyPrice() { return s_monthlyPrice; } static double getWeeklyPrice() { return s_weeklyPrice; } private: static double s_monthlyPrice; static double s_weeklyPrice; }; double MagazinePrice::s_monthlyPrice = 10.0; double MagazinePrice::s_weeklyPrice = 2.0; // 全局函数,用于订阅杂志 void subscribeMagazine(Subscription& subscription, Magazine* magazine) { subscription.subscribe(magazine); cout << subscription << endl; } int main() { // 创建杂志对象 Magazine* magazine1 = new MonthlyMagazine(1, "Science Monthly", 2022, 1); Magazine* magazine2 = new WeeklyMagazine(2, "News Weekly", 3); // 打印杂志信息 magazine1->print(); magazine2->print(); // 订阅杂志 Subscription subscription1; Subscription subscription2; subscribeMagazine(subscription1, magazine1); subscribeMagazine(subscription2, magazine2); // 打印订阅信息 subscription1.print(); subscription2.print(); // 释放资源 delete magazine1; delete magazine2; return 0; } ``` 在这个例子中,我们定义了一个基类 `Magazine`,它有两个派生类 `MonthlyMagazine` 和 `WeeklyMagazine`。 `Subscription` 类包含了一个指向 `Magazine` 对象的指针,它可以订阅一本杂志并计算总费用。我们还定义了一个静态成员 `MagazinePrice`,它存储每个杂志的价格。 在 `Subscription` 类中,我们实现了赋值运算符重载和拷贝构造函数,以确保正确地处理对象的赋值和拷贝。我们还使用了虚函数 `print()` 和纯虚析构函数 `~Subscription()`,以确保正确地处理对象的多态和销毁。 在 `main()` 函数中,我们创建了两个 `Magazine` 对象,并订阅了它们。我们还演示了如何使用全局函数 `subscribeMagazine()` 进行订阅。 总的来说,这个例子演示了C++面向对象编程的许多重要概念,包括继承、多态、静态成员、运算符重载、对象拷贝、虚函数和子对象。

最新推荐

recommend-type

【长春理工大学】面向对象程序设计下期末复习浏览题.pdf

这个是我本人在大一下学期期间整理的C++题库,涵盖机考(2018级及以后的南区软件工大一下学期程面向对象程序设计期末考试题库)中几乎所有的题目,并配有解析,方便记忆,考试这个东西……最主要还是自己会,我自己...
recommend-type

C++ 学生成绩管理系统设计报告书

个人课程设计报告书(内含源码) 内含4个类,各自具有其属性和行为。 基本实现了: (1)学生基本信息、考试科目及成绩的信息录入。 (2)已有学生信息的显示。 (3)学生基本信息的读取和保存输入数据等功能 (4)学生基本...
recommend-type

学籍管理系统源代码 c++.docx

为了学校更加高效,快捷,方便的管理学生信息,并实现以下功能: (1)对学生信息进行录入:先输入学生的学籍,然后输入学生姓名,年龄,性别,籍贯,系别,专业,班级等,最后输入学生状态(入学)。 (2)对已录取...
recommend-type

C++_面向对象程序设计_谭浩强 word完整版

第3篇 基于对象的程序设计 第8章 类和对象 第9章 关于类和对象的进一步讨论 第10章 运算符重载 第4篇 面向对象的程序设计 第11章 继承与派生 第12章 多态性与虚函数 第13章 输入输出流 第14章 C++工具
recommend-type

面向对象程序与设计作业 实验二实验报告.doc

【有代码有截图】 【实验题目、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述)、实验调试与结果分析、实验小结、建议和体会】 实验1.有如下的程序: (1)这个程序在...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。