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

Calling the base class constructor from the derived class constructor

本文关键字:函数调用 基类 构造函数 派生      更新时间:2023-10-16

我有一个问题:

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

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;
}

但是,我无法初始化派生类。我的意思是我做了这个继承,所以我可以在我的PetStore中添加animals但现在既然sizeF是私人的,我该怎么做呢?我在想也许在PetStore默认构造函数中我可以调用Farm()......所以知道吗?

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

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

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

首先,PetStore不是农场。

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

Animal_* getAnimal_(int i);
void addAnimal_(Animal_* newAnimal);
这些是

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

的意思是我做了这个继承,所以我可以将动物添加到我的宠物商店,但现在既然 sizeF 是私有的,我该怎么做?

很简单,你叫addAnimal.它public,也增加了sizeF

另外,请注意

PetStore()
{
 idF=0;
};

相当于

PetStore() : Farm()
{
 idF=0;
};

即调用基构造函数,初始化基成员。

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

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

但我无法初始化我的派生类,我的意思是我做了这个继承 所以我可以将动物添加到我的宠物商店,但现在因为 sizeF 是私人的 我能做到吗?所以我在想也许在宠物店默认 构造函数我可以调用农场()...所以任何想法???

不要惊慌。

农场构造函数将自动在宠物商店的构造函数中调用。

请参阅基类继承调用规则:调用超类构造函数的规则是什么?