遗传问题:派生类不继承基类

时间:2014-06-05 22:49:59

标签: c++ inheritance

在继承方面遇到麻烦,我理解它背后的想法但由于某种原因我的代码只是不合作。这是我的基本头文件:

#ifndef INTNODE_H
#define INTNODE_H

struct IntNode

{
int data;
IntNode *next;
IntNode( int data ) : data(data), next(0) {}

};


class IntList
{
protected:
    IntNode *head;
    IntNode *tail;
public:
    IntList();
    IntList( const IntList & );
    ~IntList();
    void display()const;
    void push_front(int);
    void push_back(int);
    void pop_front();
    void select_sort();
    void insert_sorted(int);
    void remove_duplicates();
    const IntList & operator = (const IntList &);
    void clear();
};
#endif

我的派生类的.h

#ifndef SORTEDSET_H
#define SORTEDSET_H
#include "IntList.h"


class SortedSet : public IntList
{
public:
    SortedSet();
    SortedSet(const SortedSet &);
    SortedSet(const IntList &);
    ~SortedSet();
    bool in (int);
    const SortedSet operator |(const SortedSet);
    const SortedSet operator &(const SortedSet);
    void add (int );
    void push_front(int );
    void push_back(int);
    void insert_sorted(int);
    SortedSet operator  |=(SortedSet);
    SortedSet operator &=(SortedSet);
  };


#endif

但是当我尝试编译时,它告诉我我的SortedSet类没有" head"或"尾巴"数据成员让我觉得SortedSet从未真正继承bas类。不确定我做错了什么?

编辑:这是派生类的.cpp,基类的.cpp相当冗长,但我也可以发布

#include <cstdlib>
#include <iostream>
#include "SortedSet.h"

using namespace std;

SortedSet::SortedSet():head(0),tail(0){}

SortedSet::SortedSet(const SortedSet &s):head(0),tail(0)
{
    for (IntNode *i=s.head;i!=0;i=i->next)
    {
          push_back(i->data);
    }
}

SortedSet::SortedSet(const IntList &l)
{
    for (IntNode *i=l.head;i!=0;i=i->next)
    {
          push_back(i->data);
    }
    remove_duplicates();
    select_sort();
}

SortedSet::~SortedSet(){}

SortedSet::in(int d)
{
    for(IntNode *i=head;i!=0;i=i->next)
    {
        if(i->data==d)
            return true;
    }
    return false;
}

和她是我得到的错误

IntList.cpp: In member function 'const IntList& IntList::operator=(const IntList&)':  
IntList.cpp:226: warning: control reaches end of non-void function  
SortedSet.cpp: In constructor 'SortedSet::SortedSet()':  
SortedSet.cpp:27: error: class 'SortedSet' does not have any field named 'head'  
SortedSet.cpp:27: error: class 'SortedSet' does not have any field named 'tail'  
SortedSet.cpp: In copy constructor 'SortedSet::SortedSet(const SortedSet&)':  
SortedSet.cpp:29: error: class 'SortedSet' does not have any field named 'head'  
SortedSet.cpp:29: error: class 'SortedSet' does not have any field named 'tail'  
IntList.h: In constructor 'SortedSet::SortedSet(const IntList&)':  
IntList.h:35: error: 'IntNode* IntList::head' is protected  
SortedSet.cpp:39: error: within this context  
SortedSet.cpp: At global scope:  
SortedSet.cpp:49: error: ISO C++ forbids declaration of 'in' with no type  

2 个答案:

答案 0 :(得分:2)

构造函数的初始化列表无法初始化父类的任何成员。相反,您应该调用将进行正确初始化的父构造函数。

    SortedSet::SortedSet(const SortedSet &s) : IntList(s) // ...

答案 1 :(得分:0)

您是否有可能尝试按如下方式初始化成员?

SortedSet(): head(nullptr), tail(nullptr){}

因为不允许这样做,所以你应该调用父构造函数

SortedSet(): Intlist(){}

与复制构造函数相同:

SortedSet(const SortedSet& other): Intlist(other){}

这适用于每种类型的构造函数。第二种选择是初始化构造函数体中的那些成员。

SortedSet(){
    // do stuff with haid and tail
}

此前解决的BTW问题:C++: Why does my DerivedClass's constructor not have access to the BaseClass's protected field?

此处描述了无法从SortedSet(const IntList&amp;)中的IntList访问头部的原因:subtle C++ inheritance error with protected fields