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

41

我有个问题:

假设我有一些不能修改的类(比如因为它们来自我正在使用的库):

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()... 所以有什么想法吗?


28
这不是一份作业,只是我举的一个例子,以便让你更容易理解我的问题! - Joy
4个回答

90
PetStore的构造函数会调用Farm的构造函数;你无法阻止它发生。如果不做任何事情(就像你现在所做的),它将调用默认构造函数(Farm());如果你需要传递参数,你需要在初始化列表中指定基类:
PetStore::PetStore()
    : Farm( neededArgument )
    , idF( 0 )
{
}

同样,PetStore的构造函数将通过调用Farm的构造函数来初始化sizeF。类的构造函数始终调用其所有基类和成员的构造函数。


18

首先,一个PetStore不是一个农场。

尽管如此,我们可以忽略这一点。实际上,你不需要访问私有成员变量,因为你在公共接口中已经拥有了所需的一切:

Animal_* getAnimal_(int i);
void addAnimal_(Animal_* newAnimal);

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

我的意思是,我使用继承来将动物添加到我的宠物店,但是由于 sizeF 是私有的,我该怎么办呢?

很简单,你调用 addAnimal 方法。它是 public 的,还会增加 sizeF

另外,请注意:

PetStore()
{
 idF=0;
};

等同于

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

也就是说,调用了基类构造函数并初始化了基类成员。


15
“首先,宠物店不是农场。” 但我认为你没有回答问题。看起来他需要确保在建筑过程中发生了什么。 - Klaim
好的,现在你可以这样做。不过也许可以使用我回答中的链接?这样可以确保他理解你的意思。 - Klaim
非常感谢,现在我明白了,我之前不知道 PetStore() 等同于 PetStore() : Farm()! - Joy

7

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

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

3
但是我无法初始化我的派生类,我的意思是我通过继承将动物添加到PetStore中,但现在由于sizeF是私有的,我该怎么做呢?所以我想也许在PetStore默认构造函数中我可以调用Farm()... 有任何想法吗?不要慌张。 Farm构造函数将在PetStore的构造函数中自动被调用。请参阅基类继承调用规则: 如何调用超类构造函数的规则?

非常感谢,我不知道超类构造函数会自动调用。但现在我知道了,谢谢 :) - Joy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接