2013-05-30 37 views
0

我在类中有两个重载方法,当我调用类的方法时,我传递了一个参数,它可以通过上传或向下转换匹配两个重载方法参数之一。那么究竟哪一个会被称为?c或C++类型转换

我的意思是:function1(TypeA x)function1(TypeB x),当我打电话function1(m)m可以上溯造型到TypeAm也可以向下转换到TypeB,所以这function1会叫什么名字?

+3

此无关超载,但'隐typecasting' ... –

+3

什么书说,到底是什么? –

+0

你说的是类型转换? –

回答

2

看来这个问题改变了,所以我推荐的版本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&); 

为什么?因为编译器无法知道(实际上在这个简单的版本中它可以 - 但通常情况并非如此)编译时基类引用对象的运行时类型。所以它只能选择安全的替代品。

向上转换总是可能的,因为它是安全的,因为给定的对象总是具有其基类的所有特征。应该避免向下转换,只能通过动态转换来完成。

参考:http://codepad.org/IeYK1fLC

2

在第一个示例中,将浮点精度添加到1(我相信它被称为“整数提升”)。

在第二个示例中,小数部分被截断以隐式转换为目标类型。这是在此(n3242 4.9-1)什么C++标准规定草案:

浮点类型的prvalue可以转换为一个 整数类型的prvalue。转换截断;即丢弃小数部分 。如果截断的值不能在目标类型中表示为 [注意:如果目标类型为bool,请参阅4.12。 - 注意]