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

如何引入含纯虚函数的基类且无需实现其纯虚函数

问题根本原因

你代码编译失败的核心原因是:包含纯虚函数的类B是抽象类,C++不允许抽象类被直接实例化。而std::vector<B>要求存储B类型的实例对象,底层会直接调用B的构造函数分配内存,这一操作本身就是非法的。另外就算你把B改成非抽象类,直接存对象也会触发对象切片问题,子类的特有成员会被截断,完全无法实现多态效果。

可行解决方法

两种方案都可以保留B的抽象类定义,无需修改纯虚函数,同时正常实现多态:

方法1:存储裸指针(需自行管理内存)

将vector的存储类型改为B的指针,手动new子类对象存入,用完记得delete避免内存泄漏:

#include "B.h"
#include <vector>

class A {
private:
    std::vector<B*> objects;
public:
    // 示例添加子类对象的方法
    void addObject(B* obj) {
        objects.push_back(obj);
    }
    // 示例调用多态方法
    void runAll() {
        for (auto* obj : objects) {
            obj->doSomething(); // 自动调用对应子类的实现
        }
    }
    // 析构函数记得释放所有对象避免内存泄漏
    ~A() {
        for (auto* obj : objects) {
            delete obj;
        }
        objects.clear();
    }
// ...
};

方法2:存储智能指针(推荐,自动管理生命周期)

用C++11及以后提供的std::unique_ptr或者std::shared_ptr智能指针,不需要手动释放内存,大幅降低内存泄漏风险:

#include "B.h"
#include <vector>
#include <memory>

class A {
private:
    std::vector<std::unique_ptr<B>> objects;
    // 如果需要多个地方持有同一个对象,替换为std::vector<std::shared_ptr<B>>
public:
    // 示例添加子类对象的方法
    void addObject(std::unique_ptr<B> obj) {
        objects.push_back(std::move(obj));
    }
    // 示例调用多态方法
    void runAll() {
        for (auto& obj : objects) {
            obj->doSomething(); // 正常触发多态
        }
    }
// 不需要手动写析构逻辑,智能指针会自动释放内存
};

注意:为了保证子类对象被正确释放,建议给基类B添加虚析构函数:

class B {
public:
    virtual void doSomething() = 0;
    virtual ~B() = default;
// ...
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:01