运用C++语言描述书籍类、图书类型类、图书类,每一个类应包含数据成员和成员函数。设计基类和派生类,并运用多态性和虚函数的知识,并且需要有以下内容:1)建立书籍类、图书类型类、图书类 2)书籍、图书类型、图书信息的初始化 3)书籍、图书类型、图书信息的添加、修改、删除、查找 4)图书信息的输出 5)对图书信息按编号、书名排序 6)将图书信息保存为文件 7)读取图书文件信息
时间: 2023-08-21 11:03:36 浏览: 127
好的,下面是一个简单的示例代码:
```c++
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
// 基类:书籍类
class Book {
protected:
string bookName; // 书名
int bookID; // 书籍编号
public:
Book() {} // 默认构造函数
Book(string name, int id) :bookName(name), bookID(id) {} // 带参数的构造函数
virtual void printInfo() {} // 虚函数,用于输出书籍信息
virtual ~Book() {} // 虚析构函数
};
// 派生类:图书类型类
class BookType :public Book {
private:
string typeName; // 图书类型名称
public:
BookType() {} // 默认构造函数
BookType(string name, int id, string type) :Book(name, id), typeName(type) {} // 带参数的构造函数
virtual void printInfo() { // 重载虚函数,输出图书类型信息
cout << "书籍类型:" << typeName << endl;
cout << "书籍名称:" << bookName << endl;
cout << "书籍编号:" << bookID << endl;
}
};
// 派生类:图书类
class BookInfo :public Book {
private:
string author; // 作者
string publisher; // 出版社
double price; // 价格
public:
BookInfo() {} // 默认构造函数
BookInfo(string name, int id, string author, string publisher, double price) :Book(name, id), author(author), publisher(publisher), price(price) {} // 带参数的构造函数
virtual void printInfo() { // 重载虚函数,输出图书信息
cout << "书籍名称:" << bookName << endl;
cout << "书籍编号:" << bookID << endl;
cout << "作者:" << author << endl;
cout << "出版社:" << publisher << endl;
cout << "价格:" << price << endl;
}
};
// 图书管理类
class BookManager {
private:
vector<Book*> books; // 保存所有图书的容器
public:
void addBook(Book* book) { // 添加图书
books.push_back(book);
}
void deleteBook(int id) { // 删除图书
for (auto it = books.begin(); it != books.end(); it++) {
if ((*it)->bookID == id) {
delete (*it);
books.erase(it);
break;
}
}
}
void modifyBook(int id, string name) { // 修改图书信息
for (auto it = books.begin(); it != books.end(); it++) {
if ((*it)->bookID == id) {
(*it)->bookName = name;
break;
}
}
}
void searchBook(int id) { // 查找图书信息
for (auto it = books.begin(); it != books.end(); it++) {
if ((*it)->bookID == id) {
(*it)->printInfo();
break;
}
}
}
void printAll() { // 输出所有图书信息
for (auto book : books) {
book->printInfo();
cout << endl;
}
}
void sortByID() { // 按编号排序
sort(books.begin(), books.end(), [](Book* a, Book* b) {return a->bookID < b->bookID; });
}
void sortByName() { // 按书名排序
sort(books.begin(), books.end(), [](Book* a, Book* b) {return a->bookName < b->bookName; });
}
void saveToFile(string fileName) { // 将图书信息保存到文件
ofstream fout(fileName);
for (auto book : books) {
fout << book->bookName << " " << book->bookID << " ";
if (dynamic_cast<BookType*>(book)) { // 判断是否为图书类型
fout << dynamic_cast<BookType*>(book)->typeName << endl;
}
else { // 否则为图书信息
BookInfo* info = dynamic_cast<BookInfo*>(book);
fout << info->author << " " << info->publisher << " " << info->price << endl;
}
}
fout.close();
}
void readFromFile(string fileName) { // 从文件读取图书信息
ifstream fin(fileName);
string name, type;
int id;
while (fin >> name >> id >> type) { // 如果读到图书类型信息
BookType* book = new BookType(name, id, type);
addBook(book);
}
while (fin >> name >> id) { // 如果读到图书信息
string author, publisher;
double price;
fin >> author >> publisher >> price;
BookInfo* book = new BookInfo(name, id, author, publisher, price);
addBook(book);
}
fin.close();
}
};
int main() {
BookManager manager;
// 添加图书
BookType* type1 = new BookType("C++ Primer", 1, "计算机科学");
manager.addBook(type1);
BookType* type2 = new BookType("Java核心技术", 2, "计算机科学");
manager.addBook(type2);
BookInfo* info1 = new BookInfo("高等数学", 3, "陈红梅", "清华大学出版社", 59.5);
manager.addBook(info1);
BookInfo* info2 = new BookInfo("线性代数", 4, "韩志刚", "高等教育出版社", 38.0);
manager.addBook(info2);
// 输出所有图书信息
manager.printAll();
cout << endl;
// 修改图书信息
manager.modifyBook(1, "C++ Primer Plus");
// 删除图书
manager.deleteBook(4);
// 按书名排序
manager.sortByName();
// 输出所有图书信息
manager.printAll();
cout << endl;
// 按编号排序
manager.sortByID();
// 输出所有图书信息
manager.printAll();
cout << endl;
// 查找图书信息
manager.searchBook(2);
// 将图书信息保存到文件中
manager.saveToFile("book.txt");
// 从文件中读取图书信息
manager.readFromFile("book.txt");
// 输出所有图书信息
manager.printAll();
// 释放内存
for (auto book : manager.books) {
delete book;
}
return 0;
}
```
以上只是一个简单的示例,具体的实现可能因需求而有所差异。
阅读全文
相关推荐













