これが私の質問のクラスです
class Graph {}
class SceneGraph : public Graph {}
class Node {
public:
virtual Node* getNode(int index) { return mNodeList[index]; }
protected:
vector<Node*> mNodeList;
Graph* mGraph;
}
class TransformationNode : public Node {
public:
TransformationNode* getNode(int index) { return static_cast<TransformationNode*> (mNodelist[index]); }
void _update() {
auto beg = mNodeList.begin();
auto end = mNodeList.end();
while (begin != end) {
TransformationNode* node = static_cast<TransformationNode*> (*beg);
node->_update();
}
}
private:
bool mUpdated;
SceneGraph* mGraph;
}
まず、私が解決した問題についてお話したいと思います。彼らは他の人を助けるかもしれません。そして、私が正しいかどうかを確認できます^^
戻り値の型が異なる関数をオーバーライドできますか?
Node* getNode(int index) は TransformationNode* getNode(int index) になりましたはい、戻り値の型が共変である限り: http://www.tolchz.net/?p=33
メンバーをオーバーライドできますか?
オーバーライドについてはわかりませんが、派生クラスの同じ名前の変数は、基本クラスの変数を非表示にします
そして、私が本当にどうにかして回避したい問題があります
TransformationNode クラスでは、基本クラスから派生クラスへの多くの (IMHO) 回避可能な型キャストを行いました。mNodeList ベクトルのすべての要素が TransformationNodes であることは確かにわかっていますが、mNodeList を処理するには、それらを型キャストする必要があります。
継承は正しいです。つまり、TransformationNode は
ノードであり、mNodeList はノードの子ノードを保持し、型キャストされたバージョンのノードを保持する派生クラスにコピーを持つことはできません
。最後に、static_cast の方がコストがかかる場合は reinterpered_cast を使用することもできます。これらの操作の費用について教えていただけますか? それらは本当に大きなパフォーマンスの問題ですか?
assert (dynamic_cast)... ある種の予防策はすでに講じられています。
簡単に言うと、mGraph が実際には SceneGraph* であり、mNodeList が TransformationNode* を保持していることをコンパイラーに認識させたいと考えています。これにより、型キャストが失われるのを防ぐことができます。
お時間をいただきありがとうございます