2

我对 C++ 很陌生,我不太确定如何覆盖基类中的方法。对于在发布之前没有将代码翻译成英文,我深表歉意,但我认为这不会有任何区别。

我想做的总结是为链表创建一个抽象基类,然后从中派生单/双/多链/循环列表等。

这是代码:

#ifndef __LISTA_H__
#define __LISTA_H__

class Elem;
class JulElem;

class Lista // Abstract list class
{
public:
    Lista();
    ~Lista();

    virtual void dohvatiGlavu() = 0;
    virtual void dodajNaKraj(int vred) = 0;
    virtual void dodajIza(Elem* elem, int vr) = 0;
    virtual void obrisiIza(Elem* elem) = 0;
    virtual bool prazna() = 0;
    virtual int velicina() = 0;


protected:

    class Elem
    {
    protected:
        int vred;
    };

    virtual Elem* noviElem();

private:
    Elem* glava;
};

class Jul : Lista // Singly linked list
{
public:
     void dohvatiGlavu();
     void dodajNaKraj(int vred);
     void dodajIza(Elem* elem, int vr);
     void obrisiIza(Elem* elem);
     bool prazna();
     int velicina();

private:
    class JulElem : Elem
    {
    };

    JulElem* noviElem();

};

这是我得到的错误:

error C2555: 'Jul::noviElem': overriding virtual function return type differs and is not covariant from 'Lista::noviElem'

我经常看到人们将结构用于列表元素,但我不确定这如何适合我的情况,因为不同类型的列表需要不同类型的结构。

谢谢

4

3 回答 3

3

问题是继承是私有的,因此JulElem*不与Elem*. 使用公共继承:

class JulElem : public Elem
                ^^^^^^
于 2013-11-12T14:16:34.513 回答
1

函数的返回类型不能被覆盖。你应该这样做:在基础中,将函数定义为:

virtual void noviElem(Elem** result);

参数“result”作为输出参数

于 2013-11-12T14:09:04.640 回答
0

看来您需要使用模板。

这是一个例子:

template<class T>
T Add(T n1, T n2)
{
    T result;
    result = n1 + n2;

    return result;
}
于 2013-11-12T14:09:02.850 回答