如果我做
double d = 34.56;
int i = (int)d;
我不是“垂头丧气”吗?
或者
这个术语是否仅用于类和对象?
我很困惑,因为在这种情况下,我们是从一个更大的“向下转换”double
到一个较小的int
,但是在类的情况下,我们从一个较小的“向下转换”base class
到一个更大的derived class
。
从某种意义上说,这两个约定不是相反的吗?
如果我做
double d = 34.56;
int i = (int)d;
我不是“垂头丧气”吗?
或者
这个术语是否仅用于类和对象?
我很困惑,因为在这种情况下,我们是从一个更大的“向下转换”double
到一个较小的int
,但是在类的情况下,我们从一个较小的“向下转换”base class
到一个更大的derived class
。
从某种意义上说,这两个约定不是相反的吗?
不,你不是在铸造。你只是在铸造,你正在砍掉小数点后的任何东西。
向下铸造在这里不适用。原语int
和double
不是 C++ 中的对象,并且在类层次结构中的两个对象之间没有相互关联。它们是独立的原始实体。
向下转换是指将一个对象转换为从它派生的另一个对象的行为。它指的是从类层次结构的根部向下移动的行为。它与所讨论类型的大小无关。
int
anddouble
都是原语而不是类,所以类的概念不适用于它们。
是的,这是从“较大”类型到“较小”类型的转换(就数字大小而言),但这只是“强制转换”而不是“向下转换”
两者并非完全相反,而是完全无关。在示例案例中,我们采用一种类型的值,并且强制转换采用该值并产生一个类似的值,该值具有模糊相似但完全不相关的类型。
在使用类似 遍历继承树的情况下dynamic_cast
,我们获取一个指向对象的指针(或引用),并且之前决定将其视为指向其他类型对象的指针,我们基本上(试图) 再次将其视为(更接近于)原始类型的对象。然而,特别是,我们根本没有创建新的或不同的值——我们只是创建相同值的不同视图(即,相同的实际对象)。
你不是在铸造——你是在转换。完全不同的东西。