C ++中这两种强制转换方法有啥区别? [复制]
Posted
技术标签:
【中文标题】C ++中这两种强制转换方法有啥区别? [复制]【英文标题】:What is the difference between these two casting methods in C++? [duplicate]C ++中这两种强制转换方法有什么区别? [复制] 【发布时间】:2015-07-27 15:02:17 【问题描述】:假设我们有两个类 Employee 和 Manager,其中 Manager 派生自 Employee。 e2和e3有什么区别(除了一个是指针)
Manager m;
Employee e2 = m;
Employee* e3 = &m;
我注意到,如果 Manager 覆盖了 Employee 中的虚拟方法 print,那么 e2.print() 会调用 Employee::print 而 e3->print() 会调用 Manager::print()(即,如果没有指针)。但我不确定这里到底发生了什么。
【问题讨论】:
如果 Manager 是从 Employee 派生的,如果 Employee 不是抽象的,你的类设计就会被破坏。多态层次结构中的非叶类应该是抽象的。 也许读到这个:What is Object Slicing?。你的e2
只是他以前的自我的一部分(字面意思)。
两者都不是“铸造方法”。
我不相信这是 274626 的副本。这个问题问,“什么是对象切片”。这个问题询问了两种语法结构之间的区别(其中一种导致对象切片,但这在问题中并不明确)。
【参考方案1】:
第一个:
Employee e2 = m;
... 是一个复制初始化。它创建一个新的Employee
对象,并调用复制构造函数从另一个对象m
对其进行初始化。 (一般来说,这种构造——你从派生类型的对象初始化一个对象——容易丢失一些信息;这可能会或可能不会重要,这取决于设计和获取副本的目的)。
第二个:
Employee* e3 = &m;
... 不创建单独的对象。相反,它会创建一个指向原始对象的指针。
在任何一个上调用print
方法(我假设它是一个虚拟方法)都会产生不同的结果,因为这两个对象的类型不同。在第一种情况下,对象是Employee
,因此会调用Employee::print
方法。在第二种情况下,您是在原始对象上调用该方法,因此它是Manager::print
方法。
【讨论】:
以上是关于C ++中这两种强制转换方法有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章