[英]overriding virtual function return type differs and is not covariant in Data Structure
當我嘗試編譯時,出現一個奇怪的錯誤:“覆蓋的虛函數返回類型不同並且不是協變的”,我認為問題出在 Node.js 上。 我認為BTree<T>::Node
與BSTree<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>::Node
和BTree<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.