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

定义含接口vector的类时编译报错,咨询正确实现方式

问题分析与解决方案

错误原因

编译报错的核心是:抽象类无法直接实例化。代码中std::vector<Interface>试图存储抽象类Interface的对象,但Interface包含纯虚函数nullary(),C++不允许创建抽象类的实例,因此编译器抛出错误。

两种可行修改方案

方案1:使用智能指针容器(保留多态性)

如果需要AnotherClass同时容纳SubClass1和SubClass2的实例,必须通过指针或引用实现多态。推荐用std::unique_ptr管理内存,避免手动释放的风险:

#include <iostream>
#include <vector>
#include <memory>

class Interface {
public:
    virtual int nullary() = 0;
    virtual ~Interface() = default;
};

class SubClass1 : public Interface {
public:
    int nullary() override { return 1; }
};

class SubClass2 : public Interface {
public:
    int nullary() override { return 2; }
};

class AnotherClass {
private:
    std::vector<std::unique_ptr<Interface>> elems_;
public:
    explicit AnotherClass(std::vector<std::unique_ptr<Interface>> elems) 
        : elems_{std::move(elems)} {}
};

int main() {
    std::vector<std::unique_ptr<Interface>> vec;
    vec.push_back(std::make_unique<SubClass1>());
    vec.push_back(std::make_unique<SubClass2>());
    AnotherClass obj(std::move(vec));
    return 0;
}

方案2:使用模板类(单一子类集合场景)

如果AnotherClass只需要处理某一种子类的容器(比如全是SubClass1或全是SubClass2),模板是合适的选择。这种方式无需指针,内存管理更简单,但失去了多态能力:

#include <iostream>
#include <vector>

class Interface {
public:
    virtual int nullary() = 0;
    virtual ~Interface() = default;
};

class SubClass1 : public Interface {
public:
    int nullary() override { return 1; }
};

class SubClass2 : public Interface {
public:
    int nullary() override { return 2; }
};

template <typename T>
class AnotherClass {
private:
    std::vector<T> elems_;
public:
    explicit AnotherClass(const std::vector<T>& elems) : elems_{elems} {}
};

int main() {
    std::vector<SubClass1> vec1;
    AnotherClass<SubClass1> obj1(vec1);
    
    std::vector<SubClass2> vec2;
    AnotherClass<SubClass2> obj2(vec2);
    return 0;
}

方案选择

  • 若需同时支持多种子类实例:选择智能指针容器方案。
  • 若仅处理单一子类的集合:模板是正确且更简洁的选择。

内容的提问来源于stack exchange,提问作者gust

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:33:19