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

在派生类中访问基类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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:31:03