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
相关产品推荐
相关产品推荐

