子类未能继承超类字段



我有一个名为A的类,带有以下定义:

class A {
public:
    int time;
    A *next; 
    someFunc();
    A();
    virtual ~A();
};

我有一个称为B的子类,具有以下定义:

#include "A.h"
class B : public A {
public:
    int state;
    Foo *ID;
    someFunc();
    B(int time, A *next, int state, Foo *id);
    virtual ~B();
};

b的构造函数定义为:

B::B(int time, A *next, int state, Foo *id) : time(time), next(next), state(state), ID(id) { }

当我构建程序时,我会遇到一个错误,即B类没有名为" Time"或" Next"的字段。我确保B.H文件和B.CPP文件中包含A.H,但似乎没有区别。值得注意的是,B类中的某些func((已被识别。我定义了一个与B.CPP中A类版本不同的身体。在B.H的声明中,Eclipse有一个标记,提醒我它"阴影" A :: somefunc((,所以我知道B至少继承了。

我正在以日食为基础,并使用makefile来构建它。我的B.O建筑物的线路是:

B.o: B.cpp B.h
    g++ -c -Wall -g B.cpp

我还尝试在第一行末尾添加A.H,这无济于事。我是否缺少可能导致此错误的东西?

您不能初始化基类的成员,应该是基类的责任。

您可以添加一个为A启动此类成员的构造函数:

class A {
public:   
    int time;
    A *next; 
    someFunc();
    A();
    virtual ~A();
    A(int time, A* next);
};
A::A(int time, A *next) : time(time), next(next) { }

然后

B::B(int time, A *next, int state, Foo *id) : A(time, next), state(state), ID(id) { }

或在B的构造函数中分配它们,如果您无法添加A的构造函数:

B::B(int time, A *next, int state, Foo *id) : state(state), ID(id) {
    this->time = time;
    this->next = next;
}

您为参数使用了相同的名称,因此它们"隐藏"成员。您可以在构造体的主体中做类似的事情:

this->time = time;
this->next = next;

构造函数初始化列表只能初始化其自己的类成员,而不是其父会员的成员。您通常想做的是使用父构建函数来初始化这些初始化。

class A {
public:
    int time;
    A *next; 
    someFunc();
    A(int time, A *next) : time(time), next(next) {}
    virtual ~A();
};
class B : public A {
public:
    int state;
    Foo *ID;
    someFunc();
    B(int time, A *next, int state, Foo *id) : A(time, next), state(state), ID(ID) {}
    virtual ~B();
};

B确实有来自A的成员。但是它们不在构造函数初始化列表的范围内。您必须创建一个A构造函数,以将要传递给A的参数:

class A {
public:
    int time;
    A *next; 
    someFunc();
    A(int time, A* next)
        : time(time), next(next)
    {}
    virtual ~A();
};
class B : public A {
public:
    int state;
    Foo *ID;
    someFunc();
    B(int time, A *next, int state, Foo *id)
        : A(time, next), ID(id)
    {}
    virtual ~B();
};

最新更新