新算子前的括号 - 意思是什么?

时间:2017-08-08 03:58:08

标签: c++ static new-operator multiple-inheritance

对于子课程,我有以下代码:

class child1 : public parent {
public:
    static parent* function1(void) {
        return (child2*) new child1;
    }
    //...
};

Child2是继承自父级的其他类。

在新算子(child2*)之前使用括号有什么意义? 解释函数功能的最佳方法是什么?

2 个答案:

答案 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

您应该转换为父类型。