这两种C ++中的转换方法有什么区别?

时间:2015-07-27 15:02:18

标签: c++ pointers inheritance polymorphism

假设我们有两个类Employee和Manager,其中Manager来自Employee。 e2和e3之间有什么区别(除了一个是指针)

Manager m;
Employee e2 = m;
Employee* e3 = &m;

我注意到如果Manager覆盖了Employee中的虚方法打印,那么e2.print()调用Employee :: print而e3-> print()调用Manager :: print()(即多态无效指针)。但我不确定这里到底发生了什么。

1 个答案:

答案 0 :(得分:3)

第一个:

Employee e2 = m;

...是副本初始化。它创建一个新的Employee对象,并调用复制构造函数从另一个对象m初始化它。 (一般来说,这种结构 - 你从衍生类型的对象初始化一个对象 - 容易丢失信息;这可能或不重要,取决于设计和复制的目的)。

第二个:

Employee* e3 = &m;

...不会创建单独的对象。相反,它会创建一个指向原始对象的指针。

在其中任何一个上调用print方法(我假设它是一个虚方法)会有不同的结果,因为这两个对象的类型不同。在第一种情况下,对象是Employee,因此调用Employee::print方法。在第二种情况下,您在原始对象上调用方法,因此它是Manager::print方法。