Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多态性与纯虚函数_C++_Polymorphism - Fatal编程技术网

C++ 多态性与纯虚函数

C++ 多态性与纯虚函数,c++,polymorphism,C++,Polymorphism,因此,基于以下评论,我想确认此代码是非法的,原因包括: 我们已经从抽象类Employee创建了一个对象joe 由于未定义printCheck,它使HourlyEmployee成为类似Employee的抽象类。因此,我们从一个抽象类中创建了对象joe。 ? 非法的是: Employee是一个抽象基类。这一行: Employee joe; 它本身是非法的,它正在创建抽象类的实例 joe = HourlyEmployee(); 这是一个坏主意,即使类都是完整的,因为它将切片。joe是一个对象,而不

因此,基于以下评论,我想确认此代码是非法的,原因包括:

我们已经从抽象类Employee创建了一个对象joe 由于未定义printCheck,它使HourlyEmployee成为类似Employee的抽象类。因此,我们从一个抽象类中创建了对象joe。 ?

非法的是:

Employee是一个抽象基类。这一行:

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();