对于子类,我有以下代码:
class child1 : public parent {
public:
static parent* function1(void) {
return (child2*) new child1;
}
//...
};
Child2
是从父类继承的另一个类。
在新运算符之前使用括号有什么意义,即(child2*)
?
解释函数功能的最佳方法是什么?
return (child2*)new child1;
那是C式的演员阵容。它将指针从child1 *
转换为child2 *
如果您打算将其从一种指针强制转换为另一种指针,则应改用 dynamic_cast 关键字。
return dynamic_cast< child2 * >( new child1 );
C++提供了几种演员阵容,以明确您打算使用哪种演员阵容。它为多态转换(即 - 确实有一个 vtable(提供了dynamic_cast,static_cast为转换非多态对象(即 - 没有 vtable(,reinterpret_cast告诉编译器将对象中的字节视为不同类型的对象,const_cast丢弃恒定性或易失性(或转换为 const 或易失性对象(。
许多C++程序员永远不会使用 C 样式的强制转换,因为它的语法无法提供您想要的线索。
您还应该知道子项 1 和子项 2 是否相关。一个应该是另一个的派生类。否则,dynamic_cast将返回 nullptr。
这里的括号只对父类型进行静态强制转换。
但是在这里这不会编译,因为您不能将 child1 的对象转换为 child2 的对象。 您可以使用dynamic_cast来转换不同类型的对象,但由于 child2 派生自 Parent 而不是 child1,因此此强制转换将重新调整 nullptr。
它将填充错误为 错误 1 错误 C2440:"返回":无法从"子级 2 *"转换为"父级">
应转换为"父"类型。