1. 编写程序(虚析构函数):定义一个员工类Employee,包含以下成员:两个私有成员变量,分别为char型指针变量m_name(姓名)和m_no(员工号);用于初始化成员变量的构造函数Employee(char *name,char *no);用于销毁m_name和m_no所指内存空间的析构函数~Employee();用于输出员工信息的Display()函数;以Employee类作为基类,派生出领导类Leader,新增成员:一个私有成员变量,char型指针变量m_posdes(职位描述);用于初始化成员变量的构造函数Leader(char *name, char *no, char *posdes);用于销毁m_posdes所指内存空间的析构函数~Leader();用于输出领导信息的Display()函数。
时间: 2024-03-22 22:39:30 浏览: 61
C++II习题及其解答(第1版).pdf
下面是程序的实现:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class Employee {
protected:
char *m_name; // 姓名
char *m_no; // 员工号
public:
Employee(char *name, char *no) {
m_name = new char[strlen(name) + 1];
strcpy(m_name, name);
m_no = new char[strlen(no) + 1];
strcpy(m_no, no);
}
virtual ~Employee() {
delete[] m_name;
delete[] m_no;
}
virtual void Display() {
cout << "姓名:" << m_name << endl;
cout << "员工号:" << m_no << endl;
}
};
class Leader : public Employee {
private:
char *m_posdes; // 职位描述
public:
Leader(char *name, char *no, char *posdes) : Employee(name, no) {
m_posdes = new char[strlen(posdes) + 1];
strcpy(m_posdes, posdes);
}
~Leader() {
delete[] m_posdes;
}
void Display() {
Employee::Display();
cout << "职位描述:" << m_posdes << endl;
}
};
int main() {
Employee *pEmp = new Leader("张三", "001", "部门经理");
pEmp->Display();
delete pEmp;
return 0;
}
```
在这个程序中,我们定义了一个 Employee 类作为基类,其中包含了姓名和员工号两个成员变量,以及用于初始化和销毁这些成员变量的构造函数和析构函数,以及输出员工信息的 Display 函数。
然后,我们又定义了一个 Leader 类,继承自 Employee 类,并新增了职位描述这个成员变量。在 Leader 类的构造函数中,我们先调用了基类的构造函数,再对新增的成员变量进行初始化;在析构函数中,我们先调用了基类的析构函数,再删除新增的成员变量;在 Display 函数中,我们先调用了基类的 Display 函数,再输出新增的成员变量。
最后,在主函数中,我们创建了一个 Leader 类的对象,并通过基类指针来调用它的 Display 函数。由于在基类中将析构函数声明为虚函数,因此在 delete 这个指针时,会先调用 Leader 类的析构函数,再调用 Employee 类的析构函数。这样可以确保所有成员变量都被正确地销毁,防止内存泄漏的问题。
阅读全文