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

虚函数异常求助:继承实现的十进制加法程序无结果输出

修复虚函数继承实现加法的问题

首先,你遇到的核心问题是多态未正确触发,导致子类的加法逻辑和输出没有被调用,反而执行了基类的默认行为(所以只显示"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;
}

关键修复点说明

  1. 基类虚函数规范:

    • 把add和toString声明为纯虚函数(=0),确保子类必须实现这些方法,同时让Array成为抽象类,避免直接实例化出错。
    • 添加虚析构函数,避免子类对象通过基类指针释放时出现内存泄漏。
    • 将str改为protected,让子类可以直接访问,减少不必要的接口调用。
  2. 子类重写校验:

    • 使用override关键字显式标记重写,编译器会帮你检查签名是否完全匹配(包括参数、const修饰符、返回值),避免隐形的重写失败。
    • 实现了完整的十进制字符串加法逻辑:反转字符串逐位相加、处理进位,最后反转回正常顺序。
  3. 多态触发方式:

    • 在main中使用基类指针Array*接收加法结果,调用toString时会自动触发子类Decimal的实现,而不是基类的默认行为。

为什么之前只显示"Array->"?

如果你的原代码中,基类Array的输出函数是普通成员函数,或者子类没有正确重写虚函数,那么调用基类对象/指针的输出函数时,只会执行基类的默认实现(比如输出"Array->")。通过上述修复,多态会正确触发子类的加法和输出逻辑,就能得到预期的10016结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:01:15