我想完全理解转换,即确保我知道函数调用何时会导致隐式转换,何时会导致编译错误。 我已经了解到,当且仅当有一种单一的方法将变量转换为以下列表中的两个步骤(按优先级排序)时,才能进行转换:
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,但是此代码未被编译。这是为什么?如何解决矛盾?你能否解释一下这个问题?谢谢!
答案 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
。