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

如何让抽象类Menu的所有派生类共享并更新同一个protected vector<int>成员变量?

如何让抽象类Menu的所有派生类共享并更新同一个protected vector成员变量?

嗨,你遇到的问题其实很典型——普通的类成员变量是每个对象实例独有的,所以你的Menu1和Menu2对象各自持有一份独立的commonVector,自然互相看不到对方添加的数据。

要让所有派生类实例共享同一个vector,你需要把这个成员变量改成静态成员。静态成员属于整个类,而不是某个具体对象,所有该类及其派生类的实例都会共用这一份数据。

下面是修改后的完整代码,我标注了关键改动点:

#include<iostream>
#include<vector>
using namespace std;

class Menu
{
protected:
    // 核心改动:把普通成员改为静态成员
    static vector<int> commonVector;
public:
    virtual void display() = 0;
    virtual void addNumber(int i) = 0;
    void showVector() {
        for (auto i : commonVector)
        {
            cout << i << endl;
        }
    }
};

// 静态成员必须在类外完成初始化(即使是空容器也要写)
vector<int> Menu::commonVector;

class Menu1 : public Menu
{
public:
    void display() override
    {
        cout << "That is the first menu" << endl;
    }
    void addNumber(int i) override
    {
        commonVector.push_back(i);
        cout << "number added" << endl;
    }
};

class Menu2 : public Menu
{
public:
    void display() override
    {
        cout << "That is the second menu" << endl;
    }
    void addNumber(int i) override
    {
        commonVector.push_back(i);
        cout << "number added" << endl;
    }
};

int main()
{
    Menu1 menu1;
    Menu2 menu2;
    menu1.display();
    menu2.display();
    menu1.addNumber(3);
    menu1.addNumber(5);
    menu2.addNumber(3);
    menu2.addNumber(4);
    menu1.showVector(); // 现在会输出3、5、3、4,所有添加的数都能看到
    cin.get();
    return 0;
}

改动说明:

  1. 静态成员声明:把protected区域的vector<int> commonVector改成static vector<int> commonVector;,标记它为类级别的共享成员。
  2. 静态成员初始化:在类外部添加vector<int> Menu::commonVector;,这是C++的语法要求——非inline的静态成员必须在类外完成定义初始化。

这样修改后,不管是Menu1还是Menu2的对象,操作的都是同一个commonVector,所以你调用menu1.showVector()时,就能看到所有派生类对象添加的数据了。

最后提个小提醒:如果你的代码会在多线程环境下运行,记得给这个共享的vector加锁(比如用std::mutex),避免并发访问导致的数据竞争问题。

备注:内容来源于stack exchange,提问作者Filipe Castro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:49:11