这不是向下转型吗?

3

如果我执行

double d = 34.56;
int i = (int)d;

我没有进行"下行转换(downcasting)"吗?

还是这个术语只用于类和对象方面?


我感到困惑,因为在这种情况下,我们从一个更大的double向一个较小的int 进行 "下行转换(downcasting)",但在类的情况下,我们从一个较小的基类(base class) 向一个更大的派生类(derived class) 进行 "下行转换(downcasting)"。

这两种约定在某种程度上不是相反的吗?


你不需要进行强制类型转换,因为 int i = d; 可以达到相同的效果,所以实际上与强制类型转换无关。 - David Thornley
@David Thornley:我只收到了一个警告!我本来期望得到一个错误(因为我知道C++比C更加强类型)... - Moeb
不,这是允许的(请参见标准的第4.9节),尽管如果值超出范围,则结果未定义。在这种情况下,由于“int”必须能够表示值34,因此它就是(并且根据标准必须是)。警告完全取决于编译器编写者,尽管这种截断警告很常见。虽然C ++试图比C更强类型化,但它并不总是成功。禁止“浮点整数转换”会导致太多现有的C代码不兼容。 - David Thornley
5个回答

7

而且由于他不是转换引用,而是数值。 - Steve Jessop

3
不,你并没有进行下行转换。你只是进行了强制类型转换,并且截断了小数点后面的内容。
在这里不适用下行转换。原始类型int和double在C++中不是对象,它们与类层次结构中的两个对象之间没有关系。它们是单独的原始实体。
下行转换是指将一个对象转换为另一个从它继承的对象的行为。它指的是从类层次结构的根部向下移动的行为,与所涉及的类型大小无关。

3
这不是地板函数。地板函数将数值转换为较小的整数。对于负数,如-2.5,结果将是-3.0。具体信息请参考链接:http://www.cplusplus.com/reference/clibrary/cmath/floor/。 - Andrey
删除了对 floor 的引用。最好不要过于复杂化 ;) - Daniel Bingham
@John:这是一个类型转换。当然,它也是一种转换。5.4。 - Steve Jessop
@John 这是一个类型转换和值转换。正如Steve指出的那样,尽管它会导致值的转换,但仍然属于类型转换。 - Daniel Bingham

0

intdouble都是基本数据类型而非类,因此类的概念并不适用于它们。

是的,这是从“较大”的类型转换为“较小”的类型(按数值大小计算),但这只是一个“强制类型转换”,而不是“向下转换”。


0

这两者并不是相反的,而只是没有关联的。在这个例子中,我们正在获取一个类型的值,然后进行强制转换,生成一个类型模糊但完全无关的类似值。

在使用像 dynamic_cast 这样的方法遍历继承树时,我们正在获取一个指向对象的指针(或引用),并且之前已经决定将其视为指向某种其他类型的对象的指针,我们基本上(尝试)再次将其视为原始类型的对象。但特别地,我们根本没有创建新的或不同的值 - 我们只是创建了相同值的不同视图(即,相同的实际对象)。


-1

你不是在进行强制类型转换,而是在进行类型转换。这是完全不同的两个概念。


他正在通过转换实现。问题是它是否为“向下转换”(我认为C++没有定义这个术语)。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接