簡體   English   中英

覆蓋虛函數返回類型不同並且在數據結構中不是協變的

[英]overriding virtual function return type differs and is not covariant in Data Structure

當我嘗試編譯時,出現一個奇怪的錯誤:“覆蓋的虛函數返回類型不同並且不是協變的”,我認為問題出在 Node.js 上。 我認為BTree<T>::NodeBSTree<T>::Node

基類:

#ifndef BINARY_TREE_H
#define BINARY_TREE_H

template < typename T >
class BTree {
protected:
    struct Node {
        T key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const T& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BTree();
    virtual ~BTree();
    virtual Node* search(const T& key);


private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key, BTree<T>::Node* root) {

    //some code
}

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key) {
    return search(key, root);
}

#endif // BINARY_TREE_H

派生類:

#ifndef BINARY_SEARCH_TREE_H
#define BINARY_SEARCH_TREE_H

#include "binary_tree.h"

template < typename T >
class BSTree : public BTree<T> {
protected:
    struct Node {
        T key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const T& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BSTree();
    ~BSTree() override;  
    Node* search(const T& key) override;

private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BSTree<T>::Node* BSTree<T>::search(const T& key, BSTree<T>::Node* root) {
    //some code
}

template < typename T >
typename BSTree<T>::Node* BSTree<T>::search(const T& key) {
    return search(key, root);
}

#endif // BINARY_SEARCH_TREE_H

雖然BSTree<T>派生自BTree<T> ,但BSTree<T>::NodeBTree<T>::Node之間沒有關系。 因此,指向后者的指針不能轉換為指向前者的指針。 BTree<T>::search返回一個指向BTree<T>::Node的指針。 因此,派生類中對該函數的任何覆蓋都必須返回一個可轉換BTree<T>::Node*的指針。

如前所述, BSTree<T>::Node*不是。

真的,為什么BSTree<T>::Node存在,如果它與BTree<T>::Node做同樣的事情?

這是正確的代碼。 在看到BTree<T>::Node之前小心添加typename

基類:

#ifndef BINARY_TREE_HPP
#define BINARY_TREE_HPP

template < typename T >
class BTree {
protected:
    struct Node {
        int key;
        Node* left;
        Node* right;

        Node() {}
        Node(
            const int& key,
            Node* left = nullptr,
            Node* right = nullptr)
            : left(left), right(right), key(key) {}
    };
public:
    BTree();
    virtual ~BTree();    
    virtual Node* search(const T& key);

private:
    Node* search(const T& key, Node* root);

private:
    Node* root;
};

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key, BTree<T>::Node* root) {

    // some code
}

template < typename T >
typename BTree<T>::Node* BTree<T>::search(const T& key) {
    return search(key, root);
}

派生類:

#ifndef BINARY_SEARCH_TREE_HPP
#define BINARY_SEARCH_TREE_HPP

#include "binary_tree.hpp"

template < typename T >
class BSTree : public BTree<T> {
public:
    BSTree();
    ~BSTree() override;
    typename BTree<T>::Node* search(const T& key) override;

private:
    typename BTree<T>::Node* search(const T& key, typename BTree<T>::Node* root);

private:
    typename BTree<T>::Node* root;

};

template < typename T >
typename BTree<T>::Node* BSTree<T>::search(const T& key, typename BTree<T>::Node* root) {

    // some code
}

template < typename T >
typename BTree<T>::Node* BSTree<T>::search(const T& key) {
    return search(key, root);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM