我剛在程序中發現了一些非常奇怪的行爲。我有一棵樹,每個節點都是Node
的子類。通過遍歷樹遞歸地計算邊界框,直到我到達葉節點處的單元基元(即Cube : Node
)。C++中的多態遞歸調用?
遞歸函數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++遞歸多態性我失蹤的警告嗎?
@Kyle下加入它的代碼示例 – CodeFusionMobile
什麼CreateUnitCube做的?是不是所有的立方體都有完全相同的邊界框(例如,你沒有考慮節點的位置) – benjymous
當你寫一個函數,你希望覆蓋某些東西時,你應該習慣於用覆蓋關鍵字。利用多態性捕獲大量「問題」。 – Kindread