为什么从指针到Base的static_cast到指向派生的指针“无效?”

时间:2011-04-27 18:27:48

标签: c++ casting downcast

所以我有这段代码:

Node* SceneGraph::getFirstNodeWithGroupID(const int groupID)
{
    return static_cast<Node*>(mTree->getNode(groupID));
}

mTree-&gt; getNode(groupID)返回PCSNode *。节点是从PCSNode公开派生的。

我在static_cast上找到的所有文档都说明了这一点:“static_cast运算符可以用于操作,例如将指向基类的指针转换为指向派生类的指针。”

然而,XCode(GCC)编译器说static_cast从PCSNode *到Node *是无效的,不允许。

这是为什么?当我将其切换为C风格的演员表时,没有来自编译器的抱怨。

感谢。

更新:即使问题已得到解答,我也会发布编译错误以确保完整性,以防其他人遇到同样的问题:

  

错误:语义问题:Static_cast   从'PCSNode *'到'Node *'不是   允许

1 个答案:

答案 0 :(得分:23)

原因很可能是Node的定义对编译器不可见(例如,它可能只是前向声明的:class Node;)。

自包含的例子:

class Base {};

class Derived; // forward declaration

Base b;

Derived * foo() {
    return static_cast<Derived*>( &b ); // error: invalid cast
}

class Derived : public Base {}; // full definition

Derived * foo2() {
    return static_cast<Derived*>( &b ); // ok
}