大家好我在编程简介中,对成员初始化和默认构造函数有点不确定。我们正在学习类和结构的基础知识,但我们还没有得到构造函数方法或继承,所以我有点领先于类。我在网上冲浪,我无法找到问题的确切答案,所以我想在这里问:
class ProductionWorker : public Employee
{
private:
int shiftNum;
double hourlyPay;
public:
//constructor for ProductionWorker
ProductionWorker(int newShiftNum, double newHourlyPay) : Employee(getEmpName(), getEmpNum())
{
shiftNum=newShiftNum;
hourlyPay=newHourlyPay;
}
在这个片段中我遇到的第一个问题是我收到一个错误,即类Employee
没有默认构造函数,经过一些研究后我发现如果一个类继承了另一个类,继承的类需要有一个默认的构造函数。我更多地阅读了成员初始化和从我的理解中,如果我只是让ProductionWorker
构造函数初始化Employee构造函数,我可以消除对继承类的默认构造函数的需求。
这是对的吗?
传递给Employee
构造函数的参数是“getters”,因为我不能直接传入Employee
类中保存的变量,因为它们是私有的,这会导致无法预料的问题吗?
答案 0 :(得分:2)
在创建课程之前,您无法访问其成员。所以Employee( getEmpName(), getEmpNum() )
毫无意义。您应该将这些值传递给构造函数,然后如果需要它们,请调用访问器。
public ProductionWorker( string name, int num, int shiftNum, double pay ) :
Employee( name, num )
{
this->shiftNum = shiftNum;
this->hourlyPay = pay;
}
继承是is a
关系。创建ProductionWorker
时,您还要创建Employee
。由于Employee
只有一个带有名称和编号的构造函数(我假设),因此它们通常会传递到ProductionWorker
,因此它可以正确创建Employee
。如下所述,有其他选择,但这似乎是这种情况下的合理方式。
答案 1 :(得分:1)
基类不需要默认构造函数。如果它们没有默认构造函数,派生类的每个构造函数都需要从其成员初始化列表中显式调用其中一个基类构造函数。但是,您不应尝试使用任何成员函数,因为尚未构造该对象。您基本上希望使用派生类的构造函数参数来确定要传递给基类的值。
在您的具体示例中,看起来好像Employee
基类想要获取姓名和员工编号。除了只需要派生对象的信息之外,您可能希望将它们传递给派生类。
答案 2 :(得分:0)
你认为我认为这是正确的,但你错过了一个概念。 Employee类构造函数的参数可以是setter,因为它们可能允许您设置基类的私有属性。
getter会让你得到(毫不奇怪)私有领域的价值。
顺便说一下,继承类的构造函数总是会调用基类的构造函数。当然,如果基类具有不接受任何参数的构造函数,则无需在继承类中显式调用它。
想象一下,你有课程:
class ColorCircle : public Circle{
string color;
ColorCircle (string c)
{
this.color = c;
}
}
和
class Circle {
double diameter;
Circle (double d)
{
this diameter = d;
}
}
如果你想创建一个ColorCircle
,你还必须提供有关它的直径的信息,但是ColorCircle
的构造函数没有任何地方可以做到这一点。这就是为什么ColorCircle
的构造函数应该是这样的:
ColorCircle (string c, double d) : Circle (d)
{
this.color = c;
}
当您创建ColorCircle
时,您只需:
new ColorCircle("red", 2.5);
程序负责将直径值2.5
传递给正确的基类构造函数。