Person 类与 Employee 类的多态实现
背景
有一个基类Person类,包含了私有成员姓名和职业。
有若干派生类Employee类,继承了该类。
要求用虚函数实现Person类的多态性。
本示例演示了如何使用基类(Person
)与派生类(Employee
)来实现多态性。Person
类包含了人的基本信息,如姓名和职业,而 Employee
类则继承了 Person
类,并增加了员工ID的属性。通过使用虚函数(printInfo
)和虚析构函数,我们实现了多态性,并确保了派生类对象的正确析构。
代码与注释
Person 类
// 引入必要的头文件
#include <iostream>
#include <string>
// 基类 Person
class Person {
private:
// 私有成员变量:姓名
std::string name;
// 私有成员变量:职业
std::string occupation;
public:
// 构造函数,初始化姓名和职业
Person(const std::string &name, const std::string &occupation)
: name(name), occupation(occupation) {}
// 纯虚函数,用于在派生类中实现多态性
// 必须在派生类中重写该函数
virtual void printInfo() const = 0;
// 虚析构函数,确保派生类对象能被正确析构
virtual ~Person() {}
protected:
// 提供保护访问接口,供派生类访问私有成员
// 派生类可以通过这些接口间接访问基类的私有成员
std::string getName() const {
return name;
}
std::string getOccupation() const {
return occupation;
}
};
Employee 类
// 派生类 Employee,继承自 Person 类
class Employee : public Person {
private:
// 私有成员变量:员工ID
int employeeID;
public:
// 构造函数,初始化姓名、职业和员工ID
Employee(const std::string &name, const std::string &occupation, int id)
: Person(name, occupation), employeeID(id) {}
// 重写基类的 printInfo 函数,实现多态性
void printInfo() const override {
std::cout << "姓名: " << getName()
<< ", 职业: " << getOccupation()
<< ", 员工ID: " << employeeID << std::endl;
}
// 析构函数,输出析构信息
~Employee() {
std::cout << "~Employee dealloc" << std::endl;
}
};
main 函数
int main() {
// 使用基类指针指向派生类对象,展示多态性
Person *p1 = new Employee("西门吹雪", "C++软件工程师", 12345);
Person *p2 = new Employee("海棠花开", "嵌入式工程师", 67890);
// 调用 printInfo 函数,输出员工信息
p1->printInfo();
p2->printInfo();
// 删除动态分配的对象,释放内存
delete p1;
delete p2;
// 程序结束,返回 0
return 0;
}
运行结果
姓名: 西门吹雪, 职业: C++软件工程师, 员工ID: 12345
姓名: 海棠花开, 职业: 嵌入式工程师, 员工ID: 67890
~Employee dealloc
~Employee dealloc
说明
Person
类是一个抽象基类,包含一个纯虚函数printInfo
,用于在派生类中实现多态性。Employee
类继承自Person
类,并重写了printInfo
函数,用于输出员工的详细信息。- 在
main
函数中,我们使用基类指针Person*
来指向Employee
类的对象,并通过这些指针调用printInfo
函数,展示了多态性的应用。 - 程序结束时,我们正确地删除了通过
new
分配的对象,以避免内存泄漏。