gpt4 book ai didi

c++ - 继承类中的构造函数 C++

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:49 24 4
gpt4 key购买 nike

我有一个父类:employee 有两个继承类:Hourly 和 Salary在父类中,我重载了 << 所以它将输出员工的所有变量值。我需要创建 3 名新员工:2 名小时工和 1 名薪水工,但我的构造函数似乎无法正常工作。该程序将编译,但当我调用 Hourly 构造函数时,程序停止工作(堆栈溢出?)。这是一些代码:

class employee
{
friend ostream& operator<<(ostream& out, const employee& emp);

public:

employee ();
employee(string id, string fname, string lname, string bDate, string hDate, double pay);
~employee();
void setEmpId(string id);
string getEmpID();
void setFirstName(string name);
string getFirstName();
void setLastName(string name);
string getLastName();
void setBirthDate(string birthDate);
string getBirthDate();
void setHireDate(string hireDate);
string getHireDate();
void setPayRate(double rate);
double getPayRate();

protected:

string employee_id;
string first_name;
string last_name;
string birth_date;
string hire_date;
double pay_rate;
};

这是我的父类,这是我的两个继承类:

class Hourly : public employee
{
public:

Hourly(string fname, string lname, string bdate, string hdate, double rate, string id)
{
int random = rand() % 1000;
this->employee_id=id;
this->first_name=fname;
this->last_name=lname;
this->birth_date=bdate;
this->hire_date=hdate;
this->pay_rate=rate;
}
};

Salary 类与现在基本相同。这是我尝试创建小时工的地方:

employee empOne = Hourly("Brian", "Finn", "1/12/1995", "1/12/2015", 7.25, "1215");
cout << empOne;

我知道它永远不会通过构造函数,因为我已经尝试计算测试,但程序永远不会走那么远。

最佳答案

你不能用值语义做多态。它必须是引用或指针,因此该对象在分配给 employee 对象时被分割,您最终得到一个 employee 而不是 Hourly。您可以通过在堆上创建对象来阻止它。此外,您应该将基类析构函数定义为虚拟的,否则在通过基类指针删除时会调用错误的析构函数。

最后,您应该在派生类构造函数中调用基类构造函数。

所有这些更改对我来说都很好。

#include <iostream>
#include <string>
#include <cstdlib>

using std::cout;
using std::string;
using std::ostream;

class employee
{
friend ostream& operator<<(ostream& out, const employee& emp);

public:
employee ();
employee(string const& id, string const& fname, string const& lname, string const& bDate, string const& hDate, double pay)
: employee_id(id), first_name(fname), last_name(lname), birth_date(bDate), hire_date(hDate), pay_rate(pay)
{}
virtual ~employee(){};

protected:
string employee_id;
string first_name;
string last_name;
string birth_date;
string hire_date;
double pay_rate;
};

ostream& operator<<(ostream& out, const employee& emp)
{
out << emp.employee_id;
return out;
}

class Hourly : public employee
{

public:
Hourly(string const& fname, string const& lname, string const& bdate, string const& hdate, double rate, string const& id)
: employee(id, fname, lname, bdate, hdate, rate)
{
int random = rand() % 1000;
}
};

void printEmployee(employee& e)
{
cout << e << '\n';
}

int main()
{
// using reference semantics
Hourly empOne = Hourly("Brian", "Finn", "1/12/1995", "1/12/2015", 7.25, "1215");
printEmployee(empOne);

// using pointer semantics
employee* empTwo = new Hourly("Dave", "Smith", "1/12/1995", "1/12/2015", 7.25, "1216");
cout << *empTwo << '\n';
delete empTwo; // would be better to use a `unique_ptr` and you wont need a delete.
}

关于c++ - 继承类中的构造函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com