在派生类中访问基类vector成员的实现难题
问题描述
用户实现了Base和Derived类,测试代码要求Derived的insert方法能在基类的vector末尾追加元素,但因无法访问基类的私有vector成员而受阻。
测试代码:
Base b1(2), b2(10); b1.print(); // 2 b2.print(); // 10 for (int i = 0; i < 5; i++) { b1.setN(i, (i + 1) * 20); b2.setN(i, (i + 1) * 10); } b1.printData(); // 20 40 b2.printData(); // 10 20 30 40 50 0 0 0 0 0 Derived d(5); d.print(); // 5 d.printData(); // 0 0 0 0 0 for (int i = 0; i < 10; i++) { d.setN(i, (i + 1) * 3); } d.printData(); // 3 6 9 12 15 d.insert(99); // "Base" class does not have "insert" method. d.printData(); // 3 6 9 12 15 99 -> can't solve it..!
已编写的部分代码:
class Base { int x; vector<int> v1; public: Base(int x) : x(x){ vector<int>v2(x, 0); v1 = v2; } /* ...*/ } }; class Derived : public Base { public: Derived(int x) : Base(x) {} virtual void insert(int x) { //How can I Access on Base? } };
解决方案
核心问题是基类Base的v1是私有成员,派生类Derived无法直接访问,有两种常见解决思路:
思路1:修改基类成员访问权限为protected
将Base中的x和v1改为protected权限,允许派生类直接访问这些成员:
class Base { protected: // 私有改保护,开放给派生类访问 int x; vector<int> v1; public: Base(int x) : x(x){ v1.resize(x, 0); // 替代临时vector写法,更高效 } // 实现测试所需的成员函数 void print() { cout << x << endl; } void setN(int idx, int val) { // 添加边界检查,避免越界访问 if (idx >= 0 && idx < v1.size()) { v1[idx] = val; } } void printData() { // 遍历整个vector输出所有元素 for (int num : v1) { cout << num << " "; } cout << endl; } }; class Derived : public Base { public: Derived(int x) : Base(x) {} void insert(int val) { v1.push_back(val); // 直接操作基类的protected容器 } };
思路2:基类提供公共接口操作vector
如果不想修改成员权限,可以在Base中添加操作v1的公共成员函数,派生类通过调用这些接口实现功能:
class Base { int x; vector<int> v1; public: Base(int x) : x(x){ v1.resize(x, 0); } // 提供追加元素的公共接口 void push_back_to_vector(int val) { v1.push_back(val); } // 其他测试所需的成员函数 void print() { cout << x << endl; } void setN(int idx, int val) { if (idx >= 0 && idx < v1.size()) { v1[idx] = val; } } void printData() { for (int num : v1) { cout << num << " "; } cout << endl; } }; class Derived : public Base { public: Derived(int x) : Base(x) {} void insert(int val) { push_back_to_vector(val); // 调用基类的公共接口 } };
关键细节说明
setN函数必须添加边界检查:比如测试中b1的vector大小为2,循环5次调用setN时,只有前2次是有效的,避免越界访问。printData需要遍历整个vector:确保插入新元素后能输出完整内容,符合测试预期。
内容的提问来源于stack exchange,提问作者moo malangyee
相关产品推荐
相关产品推荐

