2017-04-14 115 views
1

所以我創建了霍夫曼樹,我很難覆蓋函數,並且我認爲它是由於協方差問題。以下是我在代碼中遇到困難的層次結構:派生類不被識別爲協變

class TreeInterface { 
public: 

    TreeInterface() {} 
    virtual ~TreeInterface() {} 

    virtual NodeInterface * getRootNode() const = 0; 
}; 

class Tree : TreeInterface 
{ 
public: 
    Tree() 
    {} 
    virtual ~Tree() 
    {} 

    Node* getRootNode() 
    { 
     return treeRoot; 
    } 

    private: 
    Node* treeRoot; 
}; 

這些工作很好,但它的下一個塊有問題。

class HuffmanInterface{ 
public: 
    HuffmanInterface() {} 
    virtual ~HuffmanInterface() {} 

    virtual bool createTree(string filename) = 0; 

    virtual string encodeMessage(string toEncode) = 0; 

    virtual TreeInterface * getTree() = 0; 

    virtual map<char, string> getEncodings() = 0; 
}; 
class Huffman : HuffmanInterface{ 
public: 

    Huffman() {} 
    ~Huffman() {} 

bool Huffman::createTree(string filename){ } 

string Huffman::encodeMessage(string toEncode){ } 

string Huffman::decodeMessage(string toDecode){ } 

Tree* Huffman::getTree(){ } 

map<char, string> Huffman::getEncodings(){ } 

所以問題顯然是在getTree()函數,給下面的錯誤

invalid covariant return type for ‘virtual Tree* Huffman::getTree()’: 
Tree * getTree(); 

但據我所知,樹*應TreeInterface的有效協*。用TreeInterface替換Tree *會使程序編譯,但這不是我在我的實際程序中需要的。任何幫助是極大的讚賞!

回答

3
class Tree : TreeInterface { ... }; 

相當於

class Tree : private TreeInterface { ... }; 

你需要做的繼承public

class Tree : public TreeInterface { ... }; 
+0

哦,男人,我知道這是一個小小的,愚蠢的事情,就像那樣哈哈。謝謝你,這非常有幫助! –

+2

@TaylorBradshaw,放心吧,這不會是你會犯的最後一個愚蠢的錯誤:) :) –