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

C++类间如何实现数据继承?子类如何访问父类2d vector及优化构造?

问题分析与解决方案

现有代码的核心问题

  • 你代码中创建的A s和B c是完全独立的两个实例,B对象内部持有的父类A子对象是单独初始化的,完全没有用到s中加载好的data,所以B的构造函数读取到的data永远是空的
  • 你定义B时使用的是默认私有继承,虽然当前data是A的public成员,B内部可以访问,但如果需要在类外访问A的成员,需要改为public继承
  • 你为了让B的默认构造函数能通过编译,额外添加了A的空默认构造,这属于无意义的冗余代码,完全可以通过构造函数初始化列表规避

最优实现方案(继承场景)

直接把文件名参数透传给B的构造函数,在初始化列表调用A的带参构造,不需要额外写A的空默认构造,也不需要单独创建A实例:

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

class A
{
public:
    vector<vector<string>> data;
    fstream file;
    string word;
    // 移除无意义的空默认构造
    explicit A(string fileOpen)
    {
        file.open(fileOpen);
        while (file >> word)
        {
            vector<string> rowTemp = {word};
            data.push_back(rowTemp);
        }
    }
    vector<vector<string>> getVector()
    {
        return data;
    }
};

// 可根据需求调整为private继承,不影响B内部访问data
class B : public A
{
public:
    // 构造函数初始化列表调用A的带参构造,不需要A的默认构造
    explicit B(string fileOpen) : A(std::move(fileOpen))
    {
        // 直接访问父类的data
        for (auto &i : data)
        {
            for (auto &j : i)
            {
                cout << j << ' ';
            }
            cout << endl;
        }
    }
    
    // 后续可以直接在B里编写逻辑处理data
    void processData() {
        // 自定义处理逻辑
    }
};

int main(int argc, char* argv[]){
    if (argc < 2) return 1;
    // 直接创建B实例,传入文件名即可,不需要单独创建A
    B c(argv[1]);
    c.processData();
    return 0;
}

特殊场景:需要复用已有的A实例

如果你已经提前创建好了A的实例,希望B复用它的data,可以给B加一个接收A实例的构造函数,这种场景更推荐用组合而非继承:

class B {
public:
    vector<vector<string>>& data;
    explicit B(A& a_obj) : data(a_obj.data) {
        // 打印逻辑和原有逻辑保持一致即可
    }
};

// main中用法:
A s(argv[1]);
B c(s);

内容的提问来源于stack exchange,提问作者alex deralu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:45:03