class tree {
protected:
Node* root;
tree* next;
tree* prev;
tree* sufmin;
heap* parent;
public:
H_tree(Node* r);
virtual void combine(H_tree* T);
void update_suffix_min();
virtual void remove_tree();
virtual tree* get_suffix_min();
virtual tree* get_next();
virtual tree* get_prev();
virtual Node* get_root();
virtual heap* get_parent();
int get_rank();
virtual void set_next(tree* n);
virtual void set_prev(tree* p);
virtual void set_root(Node* r);
virtual void set_suffix_min(tree* sufmin);
virtual void set_parent(heap* p);
virtual ~tree();
};
我从这一个派生了另一个类。
class Utree : public tree
{
UNode *ro;
Uheap *pa;
Utree *ne, *pr, *su;
public:
UIH_tree(UNode* r);
void combine(Utree *T);
void remove_tree();
virtual Utree* get_suffix_min();
virtual Utree* get_next();
virtual Utree* get_prev();
virtual UNode *get_root();
virtual Uheap* get_parent();
void set_next(Utree* n);
void set_prev(Utree* p);
void set_root(UNode* r);
void set_suffix_min(Utree* sufmin);
void set_parent(Uheap* p);
}
我的问题是get_root()和get_parent()函数现在导致错误,因为返回类型不是协变的。但是Uheap和UNode是从堆和Node派生的。 UHeap类给出了与使用tree *和Utree *作为返回值的函数相同的错误,而UNode也是如此。
真正令我困惑的是,与Utap类和Utap类不同,Utree *和树*的协方差没有问题。
Unode类中的Unode *和node *也是如此。
创建错误的函数只返回指针,仅此而已。
这是编译器的问题吗?我正在使用MSVC2010。
摘自c++ standard:
重写函数的返回类型应与重写函数的返回类型相同或与函数类的协变相同。如果函数D :: f重写函数B :: f,则函数的返回类型如果满足以下条件则是协变的:
- 两者都是指向类的指针,都是对类的左值引用,或者两者都是对类的右值引用
- 返回类型B :: f中的类与返回类型为D :: f的类相同,或者是返回类型中类的明确且可访问的直接或间接基类D :: f
- 指针或引用都具有相同的cv限定,并且返回类型D :: f中的类类型与返回类型B中的类类型具有相同的cv-qualification或更少的cv-qualification: :˚F
我确信我的代码符合协方差的要求,如果我忽视某些内容,请纠正我