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

Joy*_*Joy 27 c++ inheritance constructor visibility derived-class

我有个问题:

说我原来这些我无法改变的课程(让我们说它们来自我正在使用的图书馆):

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];
}
Run Code Online (Sandbox Code Playgroud)

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

class PetStore : public Farm
{
public :
    PetStore()
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}
Run Code Online (Sandbox Code Playgroud)

但我无法初始化我的派生类,我的意思是我做了这个继承,所以我可以添加动物到我的PetStore但现在因为sizeF是私有的我怎么能这样做?我想也许在PetStore默认构造函数中我可以调用Farm()...所以任何想法?

Jam*_*nze 64

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

PetStore::PetStore()
    : Farm( neededArgument )
    , idF( 0 )
{
}
Run Code Online (Sandbox Code Playgroud)

(类似地,构造函数PetStore将调用构造函数 nameF.类的构造函数总是调用其所有基类及其所有成员的构造函数.)


Luc*_*ore 13

首先,a PetStore不是农场.

让我们过去吧.您实际上不需要访问私有成员,您在公共接口中拥有所需的一切:

Animal_* getAnimal_(int i);
void addAnimal_(Animal_* newAnimal);
Run Code Online (Sandbox Code Playgroud)

这些是您可以访问的方法,这些是您应该使用的方法.

我的意思是我做了这个继承所以我可以添加动物到我的PetStore但现在因为sizeF是私有的我怎么能这样做?

很简单,你打电话addAnimal.它是public,它也增加sizeF.

另外,请注意

PetStore()
{
 idF=0;
};
Run Code Online (Sandbox Code Playgroud)

相当于

PetStore() : Farm()
{
 idF=0;
};
Run Code Online (Sandbox Code Playgroud)

即调用基础构造函数,初始化基本成员.

  • +1"首先,PetStore不是农场." 但是我认为你没有回答这个问题.看起来他需要确定施工中会发生什么. (13认同)

Mic*_*ild 5

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

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