对于子课程,我有以下代码:
class child1 : public parent {
public:
static parent* function1(void) {
return (child2*) new child1;
}
//...
};
Child2
是继承自父级的其他类。
在新算子(child2*)
之前使用括号有什么意义?
解释函数功能的最佳方法是什么?
答案 0 :(得分:2)
return (child2*)new child1;
这是一个C风格的演员。它将指针从child1 *
转换为child2 *
如果您打算将其从一种指针转换为另一种指针,则应使用dynamic_cast关键字。
return dynamic_cast< child2 * >( new child1 );
C ++提供了几个演员表,以明确你想要什么样的演员表。它提供了用于多态转换的dynamic_cast(即 - 确实有一个vtable),static_cast用于转换非多态的对象(即 - 没有vtable),reinterpret_cast告诉编译器将对象中的字节视为a不同类型的对象,const_cast抛弃constness或volatile-ness(或转换为const或volatile对象)。
许多C ++程序员永远不会使用C风格的转换,因为它的语法不能提供你想要的线索。
您还应该知道child1和child2是否相关。一个应该是另一个的派生类。如果没有,dynamic_cast将返回一个nullptr。
答案 1 :(得分:0)
括号此处仅执行静态强制转换以键入Parent。
但是这里不会编译,因为你不能将child1的对象强制转换为child2的对象。 您可以使用dynamic_cast来转换不同类型的对象,但是因为child2派生自Parent&amp;不是来自child1,这个演员会重新调整一个nullptr。
它将填充错误为 错误1错误C2440:'return':无法从'child2 *'转换为'Parent
您应该转换为父类型。