1

我可以在不实际定义强制转换运算符的情况下转换兼容的非指针对象吗?因此,如果 B 继承自 A:

A a;
B b;

(A)b如果我不提供自己的演员表操作符,会编译吗?

编辑:它似乎确实可以编译。是因为有一个默认的转换转换运算符,还是编译器识别出兼容性并在赋值中使用默认的复制构造函数或赋值运算符?

4

2 回答 2

3

是的,它确实编译(http://ideone.com/CXbeh0

默认情况下A是可复制的。复制构造函数有签名A::A(A const &)。由于 instance ofB可以隐式转换为A const &,因此转换将使用A's 复制构造函数来解析。

到引用的转换也适用于(也是隐式生成的)复制赋值运算符,因此a = b再次使用A &A::operator=(A const &).

请记住,新对象的类型是 A,而不是 B,因此它不包含 B 的原始实例所做的任何附加信息。这很少是你想要的。

在旁注中,建议在 C++ 中忘记存在 C 样式转换并使用更具体的 C++ 转换类型:

  • 使用匹配构造函数创建目标类型临时对象的显式请求的函数样式转换;还允许使用多参数构造函数。
  • ,static_cast仅适用于兼容类型。
  • 用于通过dynamic_cast运行时检查向上转换指针/引用。
  • const_cast只处理 const。
  • 如果reinterpret_cast你真的需要玩指针技巧,但要注意别名规则。
于 2013-07-03T10:44:13.737 回答
0

如果没有定义用户定义的构造函数或运算符,则:

(A)b

将被执行为:

A(b) //Calls A copy-constructor: A::A(const A&)

也就是说,它将根据参数创建一个临时的 A 副本构造。

这称为对象拼接,这通常不是一个好主意,因为您正在复制 B 的某些字段,而不是其他字段。YMMV。

于 2013-07-03T10:44:54.850 回答