虚函数异常求助:继承实现的十进制加法程序无结果输出
修复虚函数继承实现加法的问题
首先,你遇到的核心问题是多态未正确触发,导致子类的加法逻辑和输出没有被调用,反而执行了基类的默认行为(所以只显示"Array->")。结合你的需求,我会一步步帮你定位并修复问题:
问题根源分析
从你给出的代码片段来看,大概率是这几个原因:
- 基类
Array没有声明正确的虚函数(或者没有将输出/加法函数声明为虚函数) - 子类
decimal重写虚函数时签名不匹配(比如缺了const修饰、参数类型不对) - 调用函数时没有使用基类指针/引用,导致多态失效
- 字符串加法的逻辑根本没在子类中正确实现
完整修复代码
下面是重构后的可运行代码,实现你要的十进制字符串加法:
#include <string> #include <iostream> #include <algorithm> // 用于reverse using namespace std; // 基类:抽象数组类,定义虚函数接口 class Array { protected: string str; // 把str设为protected,让子类可以直接访问 public: Array() = default; explicit Array(string s) : str(std::move(s)) {} // 纯虚函数:强制子类实现加法逻辑 virtual Array* add(const Array& other) const = 0; // 纯虚函数:强制子类实现字符串输出 virtual string toString() const = 0; virtual ~Array() = default; // 虚析构函数,防止内存泄漏 }; // 子类:十进制数类,继承Array并实现虚函数 class Decimal : public Array { public: Decimal() = default; explicit Decimal(string s) : Array(std::move(s)) {} // 重写加法函数:实现十进制字符串相加 Array* add(const Array& other) const override { // 确保other是Decimal类型 const Decimal& decOther = dynamic_cast<const Decimal&>(other); string num1 = this->str; string num2 = decOther.str; string result; // 反转字符串,方便从低位开始相加 reverse(num1.begin(), num1.end()); reverse(num2.begin(), num2.end()); int carry = 0; int maxLen = max(num1.size(), num2.size()); for (int i = 0; i < maxLen || carry; ++i) { int digit1 = (i < num1.size()) ? (num1[i] - '0') : 0; int digit2 = (i < num2.size()) ? (num2[i] - '0') : 0; int sum = digit1 + digit2 + carry; carry = sum / 10; result.push_back((sum % 10) + '0'); } // 反转回正常顺序 reverse(result.begin(), result.end()); return new Decimal(result); } // 重写输出函数:返回十进制字符串 string toString() const override { return str; } }; int main() { Decimal de("10004"); Decimal deci("12"); // 使用基类指针触发多态 Array* result = de.add(deci); cout << "求和结果:" << result->toString() << endl; // 记得释放内存 delete result; return 0; }
关键修复点说明
基类虚函数规范:
- 把
add和toString声明为纯虚函数(=0),确保子类必须实现这些方法,同时让Array成为抽象类,避免直接实例化出错。 - 添加虚析构函数,避免子类对象通过基类指针释放时出现内存泄漏。
- 将
str改为protected,让子类可以直接访问,减少不必要的接口调用。
- 把
子类重写校验:
- 使用
override关键字显式标记重写,编译器会帮你检查签名是否完全匹配(包括参数、const修饰符、返回值),避免隐形的重写失败。 - 实现了完整的十进制字符串加法逻辑:反转字符串逐位相加、处理进位,最后反转回正常顺序。
- 使用
多态触发方式:
- 在
main中使用基类指针Array*接收加法结果,调用toString时会自动触发子类Decimal的实现,而不是基类的默认行为。
- 在
为什么之前只显示"Array->"?
如果你的原代码中,基类Array的输出函数是普通成员函数,或者子类没有正确重写虚函数,那么调用基类对象/指针的输出函数时,只会执行基类的默认实现(比如输出"Array->")。通过上述修复,多态会正确触发子类的加法和输出逻辑,就能得到预期的10016结果。
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

