我可以在不实际定义强制转换运算符的情况下转换兼容的非指针对象吗?因此,如果 B 继承自 A:
A a;
B b;
(A)b
如果我不提供自己的演员表操作符,会编译吗?
编辑:它似乎确实可以编译。是因为有一个默认的转换转换运算符,还是编译器识别出兼容性并在赋值中使用默认的复制构造函数或赋值运算符?
是的,它确实编译(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
你真的需要玩指针技巧,但要注意别名规则。如果没有定义用户定义的构造函数或运算符,则:
(A)b
将被执行为:
A(b) //Calls A copy-constructor: A::A(const A&)
也就是说,它将根据参数创建一个临时的 A 副本构造。
这称为对象拼接,这通常不是一个好主意,因为您正在复制 B 的某些字段,而不是其他字段。YMMV。