转换和向上转换

时间:2012-06-26 08:32:40

标签: c++ reference implicit-conversion upcasting

我想完全理解转换,即确保我知道函数调用何时会导致隐式转换,何时会导致编译错误。 我已经了解到,当且仅当有一种单一的方法将变量转换为以下列表中的两个步骤(按优先级排序)时,才能进行转换:

1. Exact match
2. Promotion
3. Conversion
4. User defined conversion

在哪里,我理解它的方式(你可以纠正我),是促销是将原语转换为更大的原始类型,例如short to int,float to double等;转换是基元之间的任何转换,不是促销,例如int到char等;用户定义的转换是使用转换构造函数和转换运算符的类转换。 现在,我也知道继承意味着和Is-A关系,这意味着派生类是基类,因此将派生类发送到期望引用基类的函数应该有效。结合上面的两个概念,我们应该得到以下我写的例子:

class C {};
class D: public C
{
public:
D(int x){}
};
void f(C& c) {}
f(3);

由于D可以从int转换为,而D是C,但是此代码未被编译。这是为什么?如何解决矛盾?你能否解释一下这个问题?谢谢!

1 个答案:

答案 0 :(得分:5)

代码无法编译,因为转换会创建一个临时的,无法绑定到非const引用。

如果您通过const引用传递参数(或按值,但我不建议您这样做),它将起作用。

您还需要基类中的转换构造函数(如下所述)。

class C {
public:
   C(int x){}
};
class D: public C
{
public:
   D(int x):C(x){}
};

void f(const C& c) {}
f(3);

这是因为隐式转化最多只能应用一次。在您的情况下,可以从int -> D直接转换,从D -> C直接转换,因此int无法隐式转换为C