C++中为何HourlyWorker作为Employee派生类却被识别为抽象类?
解决抽象类实例化错误:HourlyWorker无法被new的问题
嘿,我之前也踩过一模一样的坑!你看到的IntelliSense: 不允许使用抽象类类型"HourlyWorker"的对象这个错误,本质原因其实很直接——你的HourlyWorker类并没有真正实现基类Employee里的所有纯虚函数,导致它本身还是个抽象类,而抽象类是绝对不能被实例化(也就是用new创建对象)的。
你提到PieceWorker能正常通过new创建并赋值给Employee*指针,这就说明PieceWorker已经完整实现了Employee的所有纯虚函数,而HourlyWorker肯定在这方面出了问题。
排查和解决步骤:
- 先明确基类的纯虚函数清单
先回到Employee类的定义,把所有带=0的纯虚函数列出来,比如假设是这两个:class Employee { public: virtual double earnings() const = 0; // 纯虚函数 virtual void print() const = 0; // 纯虚函数 // 其他成员... }; - 检查HourlyWorker的重写是否完整且正确
重点核对HourlyWorker里的函数实现,必须保证:- 所有纯虚函数都被重写了,一个都不能少
- 重写的函数签名完全匹配基类的声明——包括返回值、参数类型、数量,甚至
const修饰符都不能错
举个正确的HourlyWorker实现例子:
class HourlyWorker : public Employee { private: double hourlyWage; double hoursWorked; public: HourlyWorker(double wage, double hours) : hourlyWage(wage), hoursWorked(hours) {} // 用override关键字强制检查重写正确性(C++11及以上支持) double earnings() const override { return hoursWorked <= 40 ? hourlyWage * hoursWorked : 40 * hourlyWage + (hoursWorked-40)*hourlyWage*1.5; } void print() const override { std::cout << "Hourly Worker - Wage per hour: " << hourlyWage << ", Total hours: " << hoursWorked << std::endl; } }; - 利用override关键字规避隐性错误
强烈建议在重写虚函数时加上override关键字,这样编译器会帮你检查这个函数是否真的对应基类的某个虚函数,如果签名不匹配,编译器会直接报错,而不是偷偷让你的子类变成抽象类。
只要把HourlyWorker里的纯虚函数都正确重写了,你就能像实例化PieceWorker一样正常创建HourlyWorker对象并赋值给Employee*指针了。
内容的提问来源于stack exchange,提问作者Shahram Khalid
相关产品推荐
相关产品推荐

