我刚刚在我的程序中发现了一些非常奇怪的行为。我有一棵树,其中每个节点都是Node
. 我通过遍历树递归地计算边界框,直到到达Cube : Node
叶节点处的单元基元(即 a )。
递归函数 getBoundingBox() 被声明为虚函数并正确遍历树。叶节点覆盖该函数并返回一个单位立方体。
但是,当我跟踪程序时,似乎覆盖对递归函数 getBoundingBox() 没有影响,即使它适用于像 getName() 这样的另一个函数。
例子:
class Node;
typedef shared_ptr<Node> node_ptr;
class Node
{
protected:
vector<node_ptr> mChildren;
public:
virtual string getName() { return "Node";}
virtual BoundingBox getBoundingBox()
{
//Merge Bounding Boxes of Children
BoundingBox bb = BoundingBox();
//For each child
for(vector<node_ptr>::iterator it = mChildren.begin(); it != mChildren.end(); ++it) {
string name = (*it)->getName();//Correctly returns Node or Cube depending on type of (*it)
bb = BoundingBox::Merge(bb, (*it)->getBoundingBox());//Always calls Node::getBoundingBox(); regardless of type
}
return bb;
}
};
class Cube : public Node
{
public:
virtual string getName() { return "Cube";}
virtual BoundingBox getBoundingBox()
{
return BoundingBox::CreateUnitCube();
}
};
是否有一些关于 C++ 中的递归多态性的警告我错过了?