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

C++面向对象设计中如何通过基类A调用子类B的成员函数?

核心错误原因

你的代码存在多处语法、逻辑错误,共同触发了段错误:

  • 类型不匹配错误:main函数中A test = new A(10);写法非法,new返回的是A*指针类型,不能直接赋值给栈上的A类型对象,此处内存操作完全错误。
  • 未重载[]运算符:你直接调用test[i],但A类没有实现[]运算符重载,程序无法将test对象的下标操作关联到内部的object_pointer数组成员,直接访问非法内存触发段错误。
  • 变量未定义:A类构造函数的参数是input,但你new B[size]中用到的size没有定义,数组大小完全是随机值,必然出现越界访问。
  • 循环变量非法:main函数的while循环中,i没有初始化,也没有在循环内做i++自增操作,要么访问下标超出数组范围,要么进入死循环触发越界。
  • 潜在类结构问题:你提到A是基类、B是子类,如果需要多态调用,B的function()需要在A中声明为虚函数,不过当前错误还未触及多态逻辑。
修复方案

1. 调整类定义

首先补充A类的size成员变量、重载[]运算符,修正构造函数逻辑:

class B {
public:
    // 必须有无参构造,因为new B[]会调用无参构造初始化元素
    B() = default;
    B(unsigned int input) {
        // 初始化逻辑
    }
    void function() {
        // 业务逻辑
    }
};

class A {
public:
    unsigned int size;
    B* object_pointer;
    // 构造函数
    A(unsigned int input) : size(input) {
        // 用传入的input作为数组大小
        object_pointer = new B[size];
        for(int i = 0; i < size; i++) {
            B object(input);
            object_pointer[i] = object;
        }
    }
    // 重载[]运算符,返回对应下标的B对象引用
    B& operator[](int index) {
        // 可自行添加下标越界判断增强健壮性
        return object_pointer[index];
    }
    // 你之前提到的析构、拷贝构造、拷贝赋值、移动语义按需求实现,避免内存泄漏
    ~A() {
        delete[] object_pointer;
    }
};

2. 修正main函数逻辑

int main() {
    // 两种合法写法选一种:
    // 写法1:栈上创建A对象
    A test(10);
    // 写法2:堆上创建A对象,注意后续要手动delete
    // A* test = new A(10);
    
    int i = 0;
    while(i < 10) {
        // 如果是栈对象直接用test[i],如果是指针对象要用(*test)[i]
        test[i].function();
        i++;
    }
    
    // 如果用了堆上的A对象,要手动释放
    // delete test;
    return 0;
}

内容的提问来源于stack exchange,提问作者haonan wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:02