转换和向上转换

nod*_*dwj 3 c++ reference upcasting implicit-conversion

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

1. Exact match
2. Promotion
3. Conversion
4. User defined conversion
Run Code Online (Sandbox Code Playgroud)

其中,顺便我的理解是(你可以指正),是推广是原语转化成更大的原始类型,如短整型,浮点翻番,等等; 转换是基元之间的任何转换,不是促销,例如int到char等; 用户定义的转换是使用转换构造函数和转换运算符的类转换.现在,我也知道继承意味着和Is-A关系,这意味着派生类是基类,因此将派生类发送到期望引用基类的函数应该有效.结合上面的两个概念,我们应该得到以下我写的例子,应该工作:

class C {};
class D: public C
{
public:
D(int x){}
};
void f(C& c) {}
f(3);
Run Code Online (Sandbox Code Playgroud)

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

Luc*_*ore 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);
Run Code Online (Sandbox Code Playgroud)

这是因为隐式转换最多只应用一次.在您的情况下,有一个直接转换int -> D和一个D -> C,所以int不能隐式转换为C.