从派生类构造函数调用基类构造函数

新手上路,请多包涵

我有个问题:

假设我最初有这些我无法更改的类(假设因为它们是从我正在使用的库中获取的):

 class Animal_
{
public:
    Animal_();
    int getIdA()
    {
        return idA;
    };
    string getNameA()
    {
        return nameA;
    }
private:
    string nameA;
    int idA;
}

class Farm
{
public :
    Farm()
    {
        sizeF=0;
    }
    Animal_* getAnimal_(int i)
    {
        return animals_[i];
    }
    void addAnimal_(Animal_* newAnimal)
    {
        animals_[sizeF]=newAnimal;
        sizeF++;
    }

private:
    int sizeF;
    Animal_* animals_[max];
}

但是后来我需要一个只添加几个字段的类,所以我这样做了:

 class PetStore : public Farm
{
public :
    PetStore()
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}

但是,我无法初始化我的派生类。我的意思是我做了这个继承,所以我可以将 animals 添加到我的 PetStore 但现在因为 sizeF 是私有的,我该怎么做?我在想也许在 PetStore 我可以调用的默认构造函数 Farm() …所以有什么想法吗?

原文由 Joy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 561
2 个回答

PetStore Farm 构造函数;你没有办法阻止它。如果您什么都不做(就像您所做的那样),它将调用默认构造函数( Farm() );如果需要传递参数,则必须在初始化列表中指定基类:

 PetStore::PetStore()
    : Farm( neededArgument )
    , idF( 0 )
{
}

(类似地, PetStore 的构造函数将初始化 sizeF ,通过调用 Farm 的构造函数。一个类的所有构造函数 总是 调用其基构造函数类及其所有成员。)

原文由 James Kanze 发布,翻译遵循 CC BY-SA 4.0 许可协议

派生类构造函数已经自动调用了基类构造函数。在 C++ 中,如果基类有一个默认构造函数(不带参数,可以由编译器自动生成!),并且派生类构造函数没有调用其初始化列表中的另一个基类构造函数,则默认构造函数将叫做。即你的代码相当于:

 class PetStore: public Farm
{
public :
    PetStore()
    : Farm()     // <---- Call base-class constructor in initialision list
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}

原文由 Michael Wild 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题