如何让抽象类Menu的所有派生类共享并更新同一个protected vector<int>成员变量?
嗨,你遇到的问题其实很典型——普通的类成员变量是每个对象实例独有的,所以你的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; }
改动说明:
- 静态成员声明:把
protected区域的vector<int> commonVector改成static vector<int> commonVector;,标记它为类级别的共享成员。 - 静态成员初始化:在类外部添加
vector<int> Menu::commonVector;,这是C++的语法要求——非inline的静态成员必须在类外完成定义初始化。
这样修改后,不管是Menu1还是Menu2的对象,操作的都是同一个commonVector,所以你调用menu1.showVector()时,就能看到所有派生类对象添加的数据了。
最后提个小提醒:如果你的代码会在多线程环境下运行,记得给这个共享的vector加锁(比如用std::mutex),避免并发访问导致的数据竞争问题。
备注:内容来源于stack exchange,提问作者Filipe Castro
相关产品推荐
相关产品推荐

