我是否可以在不实际定义强制转换运算符的情况下转换兼容的非指针对象?所以,如果B继承自A:
A a;
B b;
如果我不提供自己的演员操作员,(A)b
会编译吗?
编辑:似乎编译。是因为存在默认的转换转换运算符,或者编译器是否识别兼容性并在分配中使用默认的复制构造函数或赋值运算符?
答案 0 :(得分:3)
是的,它确实编译(http://ideone.com/CXbeh0)
默认情况下A
是可复制的。复制构造函数具有签名A::A(A const &)
。由于B
的实例可隐式转换为A const &
,因此将使用A
的复制构造函数解析转换。
转换为引用也适用于(也是隐式生成的)复制赋值运算符,因此a = b
再次使用A &A::operator=(A const &)
进行编译。
请记住,新对象是A类型而不是B类,因此它不包含B的原始实例所做的任何其他信息。这很少是你想要的。
在旁注中,建议在C ++中忘记存在C风格的强制类型并使用更具体的C ++强制转换类型:
static_cast
,仅适用于兼容类型。dynamic_cast
用于上传指针/带有运行时的引用
检查。const_cast
仅处理const。reinterpret_cast
如果你真的需要玩指针技巧,但要注意别名规则。答案 1 :(得分:0)
如果没有定义用户定义的构造函数或运算符,则:
(A)b
将按以下方式实施:
A(b) //Calls A copy-constructor: A::A(const A&)
也就是说,它将从参数创建一个临时的复制构造。
这称为对象拼接,这通常是一个坏主意,因为您正在复制B的某些字段,而不是其他字段。 YMMV。