2015-11-08 75 views
0

我正在使用給予我的接口類類來構建二叉搜索樹。我有一個由純虛函數組成的BSTInterface類。它正在由BST.cpp實施的BST.h繼承。 BSTInterface描述了一個名爲getRootNode()的函數,該函數返回一個NodeInterface * My NodeInterface.h是一個由純虛函數組成的類,它由Node.h繼承,由Node.cpp實現。在我的BST :: getRootNode()函數中,我可以返回一個Node *,還是必須返回一個NodeInterface *?如果我必須返回一個NodeInterface *,我可以簡單地設置一個NodeInterface * = Node *?任何幫助理解父母和子女對象之間的關係將不勝感激。非常感謝!可以將指向子對象的指針視爲指向父對象的指針嗎?

+0

您可以將指向派生類的指針作爲指向基類的指針返回。這是多態性的基礎。 –

回答

1

特別是你的情況,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

+0

這是超好玩!謝謝一堆。 –

+0

很高興幫助。作爲一個方面說明,引用和指針的工作原理是指針的大小(以及通常由編譯器使用指針實現的引用)在同一臺機器上的大小始終相同。因此,指向基類型的指針與指向派生類型的指針的大小相同。基礎對象和派生對象不能這麼說:基礎對象有一個整數(x),而派生對象有兩個整數(x和y)。這就是指針和引用不會遭受對象分割的根本原因。 –

相關問題