派生类不被识别为协变

Posted

技术标签:

【中文标题】派生类不被识别为协变【英文标题】:Derived class not recognized as covariant 【发布时间】:2017-04-14 16:26:43 【问题描述】:

所以我正在创建一棵霍夫曼树,我很难覆盖一个函数,我相信这是由于协方差问题。这是我在代码中遇到困难的层次结构:

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();

但据我所知,Tree* 应该是 TreeInterface* 的有效协变。用 TreeInterface* 替换 Tree* 可以编译程序,但这不是我在实际程序中需要的。非常感谢任何帮助!

【问题讨论】:

【参考方案1】:
class Tree : TreeInterface  ... ;

等价于

class Tree : private TreeInterface  ... ;

你需要继承public

class Tree : public TreeInterface  ... ;

【讨论】:

哦,伙计,我知道这是一个像那样的小而愚蠢的事情哈哈。谢谢大佬,很有帮助! @TaylorBradshaw,请放心,这不会是你犯的最后一个愚蠢的错误 :) :)

以上是关于派生类不被识别为协变的主要内容,如果未能解决你的问题,请参考以下文章

派生类不从基类继承重载方法

QWidget 派生类不可见

如何处理与派生类不兼容的基类方法?

CLR 协变逆变

C++继承:派生类的虚方法不被调用[重复]

C++入门派生类和基类的构造/析构函数关系