C++重写虚函数已提供函数体仍报expected function body错误如何修复
错误原因
1. override 关键字使用位置错误
C++语法规定,override 关键字仅能用于类内部的虚函数重写声明,不允许出现在类外部的函数定义中,你在FunctionNode.cpp的函数定义末尾加override属于语法违规。
2. 类内未声明重写的方法
你没有在FunctionNode.hpp的类定义中声明toString方法,直接在cpp文件中提供实现,编译器会认为你在定义一个不存在的类成员函数。
修复步骤
- 首先修改
FunctionNode.hpp,在类的public块中添加toString的重写声明:
class FunctionNode : public DeclarationNode { // 原有私有成员不变 public: // 原有构造函数不变 std::string toString(int level) const override; // 新增这行 };
- 然后修改
FunctionNode.cpp,删掉函数定义末尾的override关键字:
std::string FunctionNode::toString(int level) const { // 原有函数体内容完全保留即可 std::string indt = indent(level); std::string s = indt + "FunctionNode\n"; s += type->toString(level + 1); s += indt + "\t" + name + "\n"; s += paramList->toString(level + 1); s += block->toString(level + 1); return s; }
可选优化建议
你当前基类Node中的toString是有空实现的虚函数,建议改为纯虚函数强制所有派生类必须重写,避免遗漏重写导致的逻辑问题:
// Node.hpp中修改toString的声明 virtual std::string toString(int level) const = 0;
内容的提问来源于stack exchange,提问作者Tom Finet
相关产品推荐
相关产品推荐

