定义含接口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
相关产品推荐
相关产品推荐

