C++代码调试:填充指定行后无输出,需修正3行代码
问题说明
给定的C++代码中,line1、line2、line3三处存在问题,导致无法得到预期输出,且仅允许修改这三行代码。输入输出示例如下:
- 输入:
o k,预期输出:ok o - 输入:
c ++,预期输出:c++ c
问题分析
- line1:原代码中
Base的虚析构函数为空实现,虽然语法合法,但使用= default更符合现代C++规范,明确复用默认析构逻辑,避免空函数冗余。 - line2:原纯虚函数定义本身功能正确,但为了代码简洁性,可省略参数名(不影响功能),同时确保与
Derived类的重写函数参数类型完全匹配,保证多态调用的正确性。 - 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
相关产品推荐
相关产品推荐

