从抽象类SimpleList派生Queue类时创建对象遇到问题
解决你的类继承与对象创建问题
先给你梳理下代码里的几个关键问题,帮你一步步搞定:
1. 抽象类的定义偏差
你说SimpleList是抽象类,但当前代码里它没有纯虚函数——C++里只有包含纯虚函数的类才是真正的抽象类。如果它确实要作为抽象基类,得添加至少一个纯虚函数,比如:
template<class T> class SimpleList { public: string ListName; SimpleList() = default; virtual ~SimpleList() = default; // 抽象类一定要加虚析构,避免内存泄漏 string getName(){ return ListName; }; // 加两个纯虚函数,让类变成抽象类 virtual void push(const T& val) = 0; virtual T pop() = 0; };
2. 子类继承的成员隐藏坑
你的Queue子类重复定义了ListName和getName(),这会直接隐藏基类的同名成员——相当于基类和子类各有一套独立的ListName和getName(),完全违背了继承的初衷。正确的做法是复用基类的成员:
template<class T> class Queue : public SimpleList<T> { public: // 不用自己定义ListName,直接用基类的 Queue(const string& name){ this->ListName = name; // 更规范的方式是给基类加带参构造,然后子类初始化时直接调用: // 基类构造改成:SimpleList(const string& name) : ListName(name) {} // 子类构造写成:Queue(const string& name) : SimpleList<T>(name) {} } // 如果不需要重写getName,完全不用定义,直接继承基类的就行;如果要重写,记得加virtual // string getName() override { return this->ListName; } };
3. 对象赋值的注意点
你提到尝试把pQLi赋值给某个对象,假设是基类指针(抽象类只能用指针或引用操作),比如:
SimpleList<int>* p = new Queue<int>("myQueue"); cout << p->getName() << endl;
如果之前的成员隐藏问题没解决,这里会出现不符合预期的结果——因为基类和子类各有一个ListName,访问时会根据指针类型来选择,很容易搞混。
优化后的完整代码示例
#include <string> #include <queue> using namespace std; template<class T> class SimpleList { public: string ListName; // 带参数的构造函数,方便子类初始化 SimpleList(const string& name) : ListName(name) {} virtual ~SimpleList() = default; virtual string getName() { return ListName; }; // 纯虚函数,确保是抽象类 virtual void push(const T& val) = 0; virtual T pop() = 0; }; template<class T> class Queue : public SimpleList<T> { private: queue<T> data; // 队列的底层存储 public: // 调用基类构造初始化ListName Queue(const string& name) : SimpleList<T>(name) {} // 实现纯虚函数 void push(const T& val) override { data.push(val); } T pop() override { T val = data.front(); data.pop(); return val; } }; // 使用示例 int main() { SimpleList<int>* pQLi = new Queue<int>("myQueue"); cout << pQLi->getName() << endl; // 输出"myQueue" pQLi->push(10); cout << pQLi->pop() << endl; // 输出10 delete pQLi; return 0; }
总结下,核心问题是继承时的成员隐藏、抽象类定义不规范,以及构造函数没正确初始化基类成员。按照上面的调整,应该能解决你创建对象和赋值时的问题。
内容的提问来源于stack exchange,提问作者Minyoung Na
相关产品推荐
相关产品推荐

