You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从抽象类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:06:33