继承的构造函数不工作|C++

Inherited Constructor not working | C++

本文关键字:C++ 工作 构造函数 继承      更新时间:2023-10-16

我的基类位于Employee.h中,这是构造函数的代码。

Employee(string Fname = "First Name not Set.", 
         string Lname = "Last Name not Set.");

这是Employee.cpp 的代码

Employee :: Employee(string Fname = "First Name not Set.", 
                     string Lname = "Last Name not Set.")
   : FirstName(Fname), LastName(Lname)
{
}

问题出在我的构造函数上,它说它们的参数是错误的,但我不确定它们出了什么问题。

经理

class Manager: public Employee
public:
    Manager(string Fname = "First Name not Set.", 
            string Lname = "Last Name not Set.", double sal = 0.0,
            string BTitle = "Boss's Title not Set."): Employee (Fname,Lname){}

管理员.cpp

Manager :: Manager(string Fname = "First Name not Set.", 
                   string Lname = "Last Name not Set.", double sal = 0.0,
                   string BTitle = "Boss's Title not Set."): Employee(Fname, Lname)
{
    FirstName = Fname;
    LastName = Lname;
    salary = sal;
    TitleOfBoss = BTitle;
}

这是我收到的错误消息:

'Manager::Manager' : redefinition of default parameter : parameter 4: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 3: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 2: : see declaration of 'Manager::Manager'
'Manager::Manager' : redefinition of default parameter : parameter 1: : see declaration of 'Manager::Manager'

Employee构造函数也是如此。

error C2572: 'Employee::Employee' : redefinition of default parameter : parameter 2: see declaration of 'Employee::Employee'
error C2572: 'Employee::Employee' : redefinition of default parameter : parameter 1: see declaration of 'Employee::Employee'

就像错误消息告诉您的那样,您已经多次定义了默认参数。在这两种情况下,默认值相同并不重要;它仍然是非法的。编译器错误的帮助页面非常清楚。

默认参数应该在类内声明构造函数的头文件中,或者应该在构造函数的实现中,但不能同时在两者中。

我建议您将它们留在头中,因为默认参数值是公共接口的一部分。然后构造函数的定义变成:

Manager::Manager( /* default values provided in header */
                  string Fname  /* = "First Name not Set." */,
                  string Lname  /* = "Last Name not Set." */,
                  double sal    /* = 0.0 */,
                  string BTitle /* = "Boss's Title not Set." */)
   : Employee(Fname, Lname)
   , salary(sal), TitleOfBoss(BTitle)
{
}

编译器将忽略注释,它们只是用来提醒您声明提供了默认参数。

我还修复了使用初始化器列表初始化子对象的构造函数。这不是Java,构造函数内部很少有代码。

根据C++标准§8.3.6/4:

默认参数不应由以后的声明重新定义(而不是甚至达到相同的值)。

然而

对于非模板函数,可以稍后在中添加默认参数同一范围内函数的声明。

所以你可以写

Employee(string Fname = "First Name not Set.", 
         string Lname = "Last Name not Set.");
//...
Employee :: Employee(string Fname, 
                     string Lname)
   : FirstName(Fname), LastName(Lname)
{
}

Employee(string Fname, 
         string Lname);
//...
Employee :: Employee(string Fname = "First Name not Set.", 
                     string Lname = "Last Name not Set.")
   : FirstName(Fname), LastName(Lname)
{
}

Employee(string Fname, 
         string Lname = "Last Name not Set.");
//...
Employee :: Employee(string Fname = "First Name not Set.", 
                     string Lname)
   : FirstName(Fname), LastName(Lname)
{
}

您已经为标头和cpp中的每个参数定义了默认值(例如:string Fname = "First Name not Set.")从cpp文件中删除它们以解决冲突,如下所示:

Manager :: Manager(string Fname, string Lname, double sal, string BTitle)