2017-08-08 41 views
0

对于一个子类,我有以下代码:新操作符之前的括号 - 是什么意思?

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

Child2是从父继承的其他类。

在新运营商之前使用括号有什么意义,即(child2*)
什么是最好的方式来解释什么功能呢?

+0

我认为它在这里没有任何意义,即使(child2 *)也会执行指针转换。 'new child1'将返回一个类型为'child1 *'的指针,然后它将被转换为'child2 *',但最终它会变成'parent *'。由于函数返回类型是'parent *'。 –

回答

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告诉编译器将对象内的字节视为不同的类型const_cast抛出const或volatile(或强制转换为const或volatile对象)。

许多C++程序员不会使用C风格的转换,因为它的语法不能提供你想要的内容。

您还应该知道child1和child2是否有关系。一个应该是另一个的派生类。如果不是,dynamic_cast将返回一个nullptr。

0

括号这里只做一个静态类型转换为Parent。

但是,这里不会编译,因为您不能将child1的对象转换为child2的对象。 您可以使用dynamic_cast来转换不同类型的对象,但由于child2是从父&派生的,而不是从child1派生的,因此此转换会重新调用nullptr。

它将填充一个错误 错误1个错误C2440:“回归”:无法从“的child2 *”转换为“父

你应该投中的类型父。

+0

这个例子没有编译。 – Tony

相关问题