通过Bruce Eckel的《Thinking in C ++》学习C ++。在第30个练习中卡住了。如下所示:
如果对按值传递的对象进行的函数调用不是早期绑定,则虚拟调用可能会访问不存在的部分。这种情况可能吗?编写一些代码来强制进行虚拟调用,看看是否会导致崩溃。为了解释行为,请检查按值传递对象时会发生什么。
我可以理解为对象调用虚拟函数的结果,但是我不知道如何强制编译器这样做,而不调用适当的构造函数。
是否有一种方法可以将一个对象视为另一个对象,而不调用适当的构造函数或运算符(用于类型转换)?
world
的say()
方法,但这是真的。h
是一个复制的、完全不同类型的对象。 - Alexhello
会感到惊讶,因为在 Java、C# 或 Objective-C 中不会发生对象切片(这是一件好事;对象切片行为是试图修复本应该在第一时间就被禁止的东西)。 - Sergey KalinichenkoBase(const Base&)
称为复制构造函数,因为它不一定会复制其参数。它只复制其参数的基类子对象。如果我们称之为“切片构造”,“切片赋值”和“按切片传递”,那么在Java程序员陷入困境之前,我们可能会帮助他们意识到C++中发生了什么有趣的事情;-) - Steve Jessop