我在一个类中有两个重载方法,当我调用类的方法时,我传递了一个参数,该参数可以通过向上转换或向下转换来匹配两个重载方法的参数之一。那么哪一个会真正被调用呢?
我的意思是:function1(TypeA x)
, function1(TypeB x)
,当我调用 时function1(m)
,m
可以向上转换到TypeA
也m
可以向下转换到TypeB
,那么哪个function1
会被调用?
在第一个示例中,浮点精度被加到 1(我相信它被称为“积分提升”)。
在第二个示例中,小数部分被截断,以便隐式转换为目标类型。这就是 C++ 标准草案对此的规定(n3242 4.9-1):
浮点类型的纯右值可以转换为整数类型的纯右值。转换截断;也就是说,小数部分被丢弃。如果截断的值不能在目标类型中表示,则行为未定义。[注意:如果目标类型是 bool,请参见 4.12。——尾注]
似乎问题发生了变化,所以我指的是第 4 版,它确实询问了向上/向下转换,与更多关于类型转换的旧版本相比。
如果你假设:
class A{};
class B: public A{};
class C: public B{};
void function(const A&);
void function(const C&);
你有一个
C c;
const A& a = c;
const B& b = c;
这样在所有情况下它都引用同一个对象,您调用并获得以下内容
function(a); // --> function(const A&);
function(b); // --> function(const A&);
function(c); // --> function(const C&);
为什么?因为编译器在编译时无法知道(实际上在这个简单的版本中它可以 - 但通常情况并非如此)基类引用对象的运行时类型。所以它只能在安全的替代方案之间进行选择。
向上转型总是可能的,因为它是安全的,因为给定的对象总是具有其基类的所有特征。应该避免向下转换,并且只能使用动态转换来完成。