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

C++代码调试:填充指定行后无输出,需修正3行代码

问题说明

给定的C++代码中,line1、line2、line3三处存在问题,导致无法得到预期输出,且仅允许修改这三行代码。输入输出示例如下:

  • 输入:o k,预期输出:ok o
  • 输入:c ++,预期输出:c++ c
问题分析
  1. line1:原代码中Base的虚析构函数为空实现,虽然语法合法,但使用= default更符合现代C++规范,明确复用默认析构逻辑,避免空函数冗余。
  2. line2:原纯虚函数定义本身功能正确,但为了代码简洁性,可省略参数名(不影响功能),同时确保与Derived类的重写函数参数类型完全匹配,保证多态调用的正确性。
  3. line3:这是核心错误,原代码将string对象的地址强制转换为Base*——string与Base无继承关系,属于非法类型转换,会导致程序访问错误内存区域、调用错误虚函数,引发未定义行为;同时delete非动态分配的栈对象也会触发未定义行为。正确做法是动态创建Derived对象,让Base*指针指向它以实现多态。
修正后的代码行

以下是修改后的三行代码:

  • line1:virtual ~Base() = default;
  • line2:virtual string fun(string) = 0;
  • line3:Base* t = new Derived(a);
完整修正后的核心代码片段
class Base
{
protected:
    string s;

public:
    Base(string c) : s(c) {}

    virtual ~Base() = default;   // 修改后的line1

    virtual string fun(string) = 0; // 修改后的line2
};

// ...

class Wrapper
{
public:
    void fun(string a, string b)
    {
        Base* t = new Derived(a); // 修改后的line3
        string i = t->fun(b);
        cout << i << " ";
        delete t;
    }
};
验证逻辑
  • 动态创建Derived(a)对象后,Base*指针t通过多态调用Derived::fun(b),返回s + x(输入的第一个字符串拼接第二个字符串),输出拼接结果。
  • delete t时,由于Base的析构函数是虚函数,触发多态析构,调用Derived的析构函数输出s成员(输入的第一个字符串),完全符合预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22