37

我有个问题:

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

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

4

4 回答 4

80

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

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

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

于 2012-04-23T14:51:15.077 回答
15

首先,aPetStore不是农场。

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

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

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

我的意思是我做了这个继承,所以我可以将动物添加到我的 PetStore 但现在由于 sizeF 是私有的,我该怎么做?

很简单,你打电话addAnimal。它是public并且它也递增sizeF

另外,请注意

PetStore()
{
 idF=0;
};

相当于

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

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

于 2012-04-23T14:48:18.000 回答
6

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

class PetStore: public Farm
{
public :
    PetStore()
    : Farm()     // <---- Call base-class constructor in initialision list
    {
     idF=0;
    };
private:
    int idF;
    string nameF;
}
于 2012-04-23T14:50:36.933 回答
2

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

不要恐慌。

在 PetStore 的构造函数中会自动调用 Farm 构造函数。

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

于 2012-04-23T14:48:49.470 回答