C++多层继承类编译报构造函数、成员函数未定义符号问题
C++三层继承类体系未定义符号报错问题梳理
编译输出的报错信息
Undefined symbol: employeessavitch::SalariedEmployee::SalariedEmployee() Undefined symbol: employeessavitch::SalariedEmployee::SalariedEmployee() Undefined symbol: employeessavitch::SalariedEmployee::get_salary() const Undefined symbol: employeessavitch::Employee::get_ssn() const Undefined symbol: employeessavitch::Employee::get_name() const
报错根因
这类未定义链接错误,本质是编译单元存在语法错误,编译器无法生成可链接的二进制符号,导致链接阶段找不到对应的函数实现,具体问题点如下:
- 头文件冗余自包含错误
employee.h中错误写入自引入语句#include "employee.h",salariedemployee.h中错误写入自引入语句#include "salariedemployee.h",这类冗余写法会干扰编译器的头文件解析流程
employee.cpp存在构造函数重复定义的语法错误- 头文件仅声明1个双参数构造函数
Employee(string the_name, string the_ssn),但实现代码中写了两个参数列表完全一致的双参数构造函数,属于C++语法明确禁止的重复定义,编译器会直接终止该编译单元的目标文件生成,导致Employee类的所有成员函数(包括get_name()、get_ssn())都无法生成可链接的符号
- 头文件仅声明1个双参数构造函数
salariedemployee.cpp存在花括号不匹配、函数嵌套定义的严重语法错误- 第一份不完整的
print_check()函数没有书写闭合花括号,直接在其函数体内部又定义了一个同名的print_check()成员函数,最终花括号配对后导致整个命名空间没有被正确闭合,编译器完全无法解析该文件的类成员实现,SalariedEmployee类的构造函数、get_salary()等成员都无法生成可链接的符号
- 第一份不完整的
- 代码逻辑存在运行时隐患
Manager类构造函数未给reports指针初始化,析构时对野指针执行delete[]会触发内存崩溃addReport方法存在数组下标越界、申请的新数组未赋值给类成员、新增员工未正确放入数组、计数未更新的逻辑错误
修正操作步骤
- 移除两个头文件中的自包含语句,删除
employee.h内的#include "employee.h",删除salariedemployee.h内的#include "salariedemployee.h" - 删除
employee.cpp中空实现的冗余双参数构造函数,保留带成员初始化列表的正确构造实现 - 删掉
salariedemployee.cpp中第一份不完整的print_check()代码块,保留完整实现的版本,补全所有缺失的函数体、命名空间闭合花括号,保证花括号完全配对 - 在
Manager构造函数中添加reports = nullptr;初始化指针,修正addReport方法逻辑:将新员工放到report[noReport]下标位置,把新申请的数组指针赋值给类成员reports,执行noReport++更新计数
内容的提问来源于stack exchange,提问作者Maaz Adil
相关产品推荐
相关产品推荐

