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 ++中这两种强制转换方法有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中编译 生成 调试 测试 运行各是啥意思有啥区别

头条三面:toString()String.valueOf(String)强转,有啥区别?

C:链接列表中这两个声明之间的区别

Oracle中执行存储过程call和exec区别

[MySQL练习] 查询两个表的差集(两种方法)

idea中这几个都是重启的意思,那有啥区别