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)
即调用基础构造函数,初始化基本成员.
派生类构造函数已经自动调用了基类构造函数.在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)