我正在使用給予我的接口類類來構建二叉搜索樹。我有一個由純虛函數組成的BSTInterface類。它正在由BST.cpp實施的BST.h繼承。 BSTInterface描述了一個名爲getRootNode()的函數,該函數返回一個NodeInterface * My NodeInterface.h是一個由純虛函數組成的類,它由Node.h繼承,由Node.cpp實現。在我的BST :: getRootNode()函數中,我可以返回一個Node *,還是必須返回一個NodeInterface *?如果我必須返回一個NodeInterface *,我可以簡單地設置一個NodeInterface * = Node *?任何幫助理解父母和子女對象之間的關係將不勝感激。非常感謝!可以將指向子對象的指針視爲指向父對象的指針嗎?
回答
特別是你的情況,C++允許covariant return types。這意味着您不僅可以從繼承的方法返回一個派生類類型,但你也可以聲明繼承函數返回devired類型:
class Node {};
class SpecialNode : public Node {};
class Base {
public:
virtual Node* getRootNode() = 0;
};
class Derived : public Base {
public:
virtual SpecialNode* getRootNode() override {
/* return a special node... */
}
};
在一般情況下,你可以派生類型的指針賦給一個指針的基類型:
Node* node = new SpecialNode();
請注意,這隻適用於引用和指針。你不能做同樣的沒有被聲明爲指針或引用的對象:當有足夠的內存只分配給基類出現
void someFunction (Node node) {}
SpecialNode sn;
// Causes "slicing" to occur
someFunction(sn);
切片,因爲編譯器通過它的參數使用的節點參數的類型信息聲明(編譯器只爲Node
分配足夠的內存,而不是SpecialNode
)。如果下面分別宣佈
class Node {
private:
int x;
};
class SpecialNode : public Node {
private:
int y;
};
的「Y」數據成員將不會出現在傳遞給someFunction
節點,因爲它已被「切片」。請注意,這隻發生在傳值參數中,而不是通過引用傳遞或傳遞指針。有關更多信息,請參閱object slicing。
這是超好玩!謝謝一堆。 –
很高興幫助。作爲一個方面說明,引用和指針的工作原理是指針的大小(以及通常由編譯器使用指針實現的引用)在同一臺機器上的大小始終相同。因此,指向基類型的指針與指向派生類型的指針的大小相同。基礎對象和派生對象不能這麼說:基礎對象有一個整數(x),而派生對象有兩個整數(x和y)。這就是指針和引用不會遭受對象分割的根本原因。 –
- 1. 設置指向對象的指針,讓對象指向對方
- 2. 傳遞對象指針作爲指向基類的指針
- 3. 獲取雙指針指向的對象
- 4. boost :: gil指向bgr8_view_t對象的指針
- 5. 指向對象開始的指針(C++)
- 6. 指向對象類型的指針
- 7. 解引用指向對象的指針
- 8. 指針幫助,指向對象的指針和類
- 9. 獲取對象指針指向
- 10. 這是將指針指向對象的正確方法嗎?
- 11. 創建一個指向抽象對象的指針向量
- 12. ,對象和指向對象的指針有什麼區別?
- 13. 指向指針的指針和指向數組的指針
- 14. 指針指向指針
- 15. 搜索對象指針的向量
- 16. 創建指針對象的向量
- 17. 指向抽象類的指針數組
- 18. 向量含有矢量對象指針的最終指向同一對象
- 19. 將「指向子類的指針」附加到「指向父類的指針」的向量中
- 20. 指向Struct的指針的指針
- 21. 原始對象的C++指針和複製對象的指針
- 22. 在指針使用函數後,如何更改指針指向的對象
- 23. 如何更新對象內部的JavaScript指針以指向另一個對象?
- 24. 將指針指向無匹配NULL的指針嗎?
- 25. 指向指針數組的指針是?
- 26. 什麼是指向指針的指針?
- 27. 指向Char陣列指針的指針
- 28. C++ - 指向數組的指針 - 指針
- 29. 指向C++指針的指針
- 30. 指向結構指針的指針
您可以將指向派生類的指針作爲指向基類的指針返回。這是多態性的基礎。 –