C++ 多态性与纯虚函数
因此,基于以下评论,我想确认此代码是非法的,原因包括: 我们已经从抽象类Employee创建了一个对象joe 由于未定义printCheck,它使HourlyEmployee成为类似Employee的抽象类。因此,我们从一个抽象类中创建了对象joe。 ? 非法的是: Employee是一个抽象基类。这一行:C++ 多态性与纯虚函数,c++,polymorphism,C++,Polymorphism,因此,基于以下评论,我想确认此代码是非法的,原因包括: 我们已经从抽象类Employee创建了一个对象joe 由于未定义printCheck,它使HourlyEmployee成为类似Employee的抽象类。因此,我们从一个抽象类中创建了对象joe。 ? 非法的是: Employee是一个抽象基类。这一行: Employee joe; 它本身是非法的,它正在创建抽象类的实例 joe = HourlyEmployee(); 这是一个坏主意,即使类都是完整的,因为它将切片。joe是一个对象,而不
Employee joe;
它本身是非法的,它正在创建抽象类的实例
joe = HourlyEmployee();
这是一个坏主意,即使类都是完整的,因为它将切片。joe是一个对象,而不是一个引用
如果HourlyEmployee保持抽象并没有实现printCheck,那么您的行当然是非法的,因为您正在创建一个临时实例
顺便说一句,如果这两个类都是完整的,因此代码被编译了,但是printCheck仍然是虚拟的,而不是纯粹的,那么
joe.printCheck();
将调用Employee版本,而不是HourlyEmployee版本,因为joe属于Employee类型,并且无论分配如何,joe仍然是Employee类型。这就是为什么切片通常是个坏主意。HourlyEmployee类需要实现基类的printCheck函数。
一旦你实现了这个函数,HourlyEmployee就是一个可对象类。不,这是不合法的,它不会被编译。@jyim想解释一下为什么你认为它是合法的吗?在你发布下一个问题Joe为什么不是多态性之前,你在这里也做了一个对象切片根据教科书上的答案,它说它是合法的,但我不这么认为……所以,出于最初陈述的原因,这绝对是非法的?看起来类似于python语法。C++使用基类的指针和引用。HourlyEmployee将是抽象的,除非它覆盖,即实现printCheck
joe.printCheck();