假设我们有两个类Employee和Manager,其中Manager来自Employee。 e2和e3之间有什么区别(除了一个是指针)
Manager m;
Employee e2 = m;
Employee* e3 = &m;
我注意到如果Manager覆盖了Employee中的虚方法打印,那么e2.print()调用Employee :: print而e3-> print()调用Manager :: print()(即多态无效指针)。但我不确定这里到底发生了什么。
答案 0 :(得分:3)
第一个:
Employee e2 = m;
...是副本初始化。它创建一个新的Employee
对象,并调用复制构造函数从另一个对象m
初始化它。 (一般来说,这种结构 - 你从衍生类型的对象初始化一个对象 - 容易丢失信息;这可能或不重要,取决于设计和复制的目的)。
第二个:
Employee* e3 = &m;
...不会创建单独的对象。相反,它会创建一个指向原始对象的指针。
在其中任何一个上调用print
方法(我假设它是一个虚方法)会有不同的结果,因为这两个对象的类型不同。在第一种情况下,对象是Employee
,因此调用Employee::print
方法。在第二种情况下,您在原始对象上调用方法,因此它是Manager::print
方法。