栈与队列继承层次作业求助:DataStructure类虚函数push与统一pop实现
栈与队列继承层次结构的完整实现方案
嘿,我来帮你搞定这个C++作业!先明确你的核心需求,再基于你给出的代码片段补全优化,确保完全符合作业要求:
作业核心要求回顾
- 创建父类
DataStructure,包含push和pop成员函数 push必须设为虚函数,允许子类(栈、队列)重写实现各自的入栈/入队逻辑pop仅在父类中声明一次(这里指统一接口声明,子类根据自身特性实现具体弹出逻辑)
你提供的现有代码片段
#include <iostream> #include <vector> using namespace std; class DataStructure { protected: vector<int> data; public: void push(int element) { } int pop() { if (data.size() == 0... } };
完善后的完整代码实现
下面是满足要求的完整代码,包含子类实现、异常处理和测试逻辑:
#include <iostream> #include <vector> #include <stdexcept> using namespace std; // 抽象父类:数据结构基类 class DataStructure { protected: vector<int> data; // 子类可直接访问的存储容器 public: // 将push声明为纯虚函数,强制子类实现(也可设为普通虚函数提供默认实现) virtual void push(int element) = 0; // pop接口在父类声明,子类重写实现具体逻辑 virtual int pop() = 0; // 通用判空函数,子类可直接使用 bool isEmpty() const { return data.empty(); } // 虚析构函数:确保删除子类对象时正确调用析构链,避免内存泄漏 virtual ~DataStructure() = default; }; // 栈子类:遵循后进先出(LIFO)规则 class Stack : public DataStructure { public: void push(int element) override { data.push_back(element); // 栈的入栈:尾插元素 } int pop() override { if (data.empty()) { throw runtime_error("Stack underflow! 栈为空无法弹出"); } int top_val = data.back(); data.pop_back(); // 栈的出栈:删除最后一个元素 return top_val; } }; // 队列子类:遵循先进先出(FIFO)规则 class Queue : public DataStructure { public: void push(int element) override { data.push_back(element); // 队列的入队:尾插元素 } int pop() override { if (data.empty()) { throw runtime_error("Queue underflow! 队列为空无法弹出"); } int front_val = data.front(); data.erase(data.begin()); // 队列的出队:删除第一个元素 return front_val; } }; // 测试代码 int main() { try { // 测试栈 Stack my_stack; my_stack.push(10); my_stack.push(20); my_stack.push(30); cout << "栈弹出元素:" << my_stack.pop() << endl; // 输出30 cout << "栈弹出元素:" << my_stack.pop() << endl; // 输出20 // 测试队列 Queue my_queue; my_queue.push(100); my_queue.push(200); my_queue.push(300); cout << "队列弹出元素:" << my_queue.pop() << endl; // 输出100 cout << "队列弹出元素:" << my_queue.pop() << endl; // 输出200 // 测试空结构弹出(取消注释会触发异常) // my_stack.pop(); } catch (const exception& e) { cerr << "错误信息:" << e.what() << endl; } return 0; }
关键细节解释
- 纯虚函数的使用:把
push和pop设为纯虚函数,让DataStructure成为抽象类,不能直接实例化,既符合“父类仅定义接口”的设计思路,又强制子类必须实现这两个核心方法。 - 子类特性实现:栈的
pop操作删除容器最后一个元素,队列的pop删除第一个元素,完美贴合各自的规则;两者的push都是尾插,虽然逻辑一致,但因父类要求push是虚函数,所以子类仍需显式重写(也可以在父类提供默认实现,子类按需修改)。 - 异常处理:在
pop时检查容器是否为空,抛出明确的异常信息,避免程序因非法访问崩溃,增强代码健壮性。 - 虚析构函数:父类添加虚析构函数是C++继承体系中的最佳实践,确保当你用父类指针指向子类对象并删除时,能正确调用子类的析构函数,避免内存泄漏。
内容的提问来源于stack exchange,提问作者user9603529
相关产品推荐
相关产品推荐

