点击蓝字

关注我们

实验目的

1.掌握多重继承的使用。

2.理解虚基类的作用。

3.熟悉派生类对象与基类的转换。

1

实验要求

1.将代码和运行结果复制到word文档提交。

2.word文档命名格式:实验X-姓名-学号。

3.禁止抄袭。

4.按时提交。

2

实验内容

1.从Person类派生出学生类Student和教师类Teacher;从Student类中派生研究生类Graduate;从Graduate类和Teacher类派生出助教生类Assistant。根据类视图完成类的定义以及相应的构造函数,注意虚基类的使用。在main函数中创建类的对象测试这些类。(测试派生类对象与基类的转换,熟悉各对象的内存模型,可选做)

下面给出各个类的成员和继承关系。

1)Person类数据成员:

string name_;      //姓名

Gender gender_;   // 性别,枚举类型

Birthday birth_;     //出生日期,类对象

2)Student类添加int类型成绩(score)成员

3)Teacher类添加string类型职称(title)成员

4)Graduate类添加string类型导师(advisor)成员

5)Assistant类添加string类型专业(subject)成员。

(

类图显示

3

代码

```

#include

using namespace std;

enum Gender {

Male, Female

};

class Birthday {

public:

Birthday(int day, int month, int year) : day_(day), month_(month), year_(year) {}

void Print() {

cout << "生日:" << day_ << "日 " << month_ << "月 " << year_ <

}

private:

int day_;

int month_;

int year_;

};

class Person {

public:

Person() :gender_(Male), name_("") {}

Person(const Birthday& birth, Gender gender, const string& name) : birth_(birth), gender_(gender), name_(name) {}

void Print() {

cout << "name:" << name_ << " sex";

if (gender_ == 0)

cout << " male" << " ";

else

cout << " female" << " ";

birth_.Print();

}

private:

Birthday birth_ = Birthday(0, 0, 0);

Gender gender_;

string name_;

};

class Student : virtual public Person {

public:

Student() :Person(), score_(0) {}

Student(const Birthday& birth, Gender gender, const string& name, int score) : Person(birth, gender, name),

score_(score) {}

void Print() {

Person::Print();

cout << " ";

PrintScore();

}

void PrintScore() {

cout << "score:" << score_;

}

private:

int score_;

};

class Teacher : virtual public Person {

public:

Teacher() :Person(), title_("") {}

Teacher(const Birthday& birth, Gender gender, const string& name, const string& title) : Person(birth, gender,

name),

title_(title) {}

void Print() {

Person::Print();

cout << " ";

PrintTitle();

}

void PrintTitle() {

cout << "职称:" << title_;

}

private:

string title_;

};

class Graduate : public Student {

public:

Graduate() :Student(), advisor_("") {}

Graduate(const string& name, Gender gender, const Birthday& birthday, int score, const string& advisor) : Student(

birthday, gender, name, score), advisor_(advisor), Person(birthday, gender, name) {}

void Print() {

Student::Print();

cout << " ";

PrintAdvisor();

}

void PrintAdvisor() {

cout << "导师:" << advisor_;

}

private:

string advisor_;

};

class Assistant : public Graduate, public Teacher {

public:

Assistant() :Graduate(), Teacher(), subject_("") {}

Assistant(const string& name, Gender gender, const Birthday& birthday, int score, const string& advisor,

const string& title, const string& subject)

: Graduate(name, gender, birthday, score, advisor), Teacher(birthday, gender, name, title), Person(birthday, gender, name),

subject_(subject) {}

void Print() {

Person::Print();

cout << " ";

Student::PrintScore();

cout << " ";

Graduate::PrintAdvisor();

cout << " ";

Teacher::PrintTitle();

cout << " ";

PrintSubject();

}

void PrintSubject() {

cout << "专业:" << subject_;

}

private:

string subject_;

};

int main() {

Person person(Birthday(3, 5, 3), Male, "Linux");

person.Print();

cout << endl;

Student student(Birthday(6, 3, 7), Male, "丹尼斯里奇", 99);

student.Print();

cout << endl;

Teacher teacher(Birthday(8, 2, 6), Male, "阿兰图灵", "码师");

teacher.Print();

cout << endl;

Graduate graduate("reww", Male, Birthday(9, 9, 9), 0, "cwj");

graduate.Print();

cout << endl;

Assistant assistant("ymj", Female, Birthday(10, 10, 10), 60, "马冬梅", "程序猿",

"计算机");

assistant.Print();

cout << endl;

}

```

扫码关注我们

2019软件工程

图文源自:一个神秘人

基类使用私有数据_C++作业之多继承与虚基类相关推荐

  1. 【C++】继承和派生、虚继承和虚基类、虚基类表和虚基类指针

    继承和派生.虚继承和虚基类.虚基类表和虚基类指针 继承和派生 继承概述 继承基本概念 派生类中的成员 继承的内容 派生类定义 派生类访问控制 对象构造和析构 对象构造和析构的调用顺序 继承中的构造和析 ...

  2. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  3. 多重继承、虚继承与虚基类

    一.多重继承 单重继承--一个派生类最多只能有一个基类 多重继承--一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,-. {-.}; 派生类同时继承多个基类的成员,更 ...

  4. 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类

     常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式 ...

  5. 定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount。

    [问题描述] 定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount. [输入形式] 程序参考的输入(数据前面文字为提示): Input N ...

  6. [YTU]_2622(B 虚拟继承(虚基类)-沙发床(改错题))

    题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(Sofa)用,所以叫沙发床(SleeperSofa). 同时床和沙发又是一种特殊的家具(Furniture),具有一切家具的特性. 利用虚拟继 ...

  7. C++中的各种“虚“-- 虚函数、纯虚函数、虚继承、虚基类、虚析构、纯虚析构、抽象类讲解

    C++中的各种"虚" 1. 菱形继承 1.1 虚继承 && 虚基类 1.2 虚基类指针(vbptr)&& 虚基类表(vbtable) 2. 多态 2 ...

  8. 在保护继承中基类的共有成员_C++学习大纲:继承方式的调整

    C++ 继承方式的调整 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制. 调整格式 [public: | protected: | private: ] :: ; ...

  9. C++中访问类的私有数据成员的第三种方法

    我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...

最新文章

  1. java wms open,OpenLayers - 调用WMS安全层
  2. 5图片展示_做跨境电商想拍出爆款产品图片,我只用这五招
  3. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  4. spring核心:bean工厂的装配 1
  5. Oracle入门(三A)之sqlplus
  6. 动态数组相关操作 0104 ArrayList
  7. linux的可执行文件是什么后缀
  8. 套件端口 群晖_群晖NAS的各种端口
  9. AHU 2022 CTF新生赛web_writeup
  10. GitHub上12k Star的《Java工程师成神之路》终于开放阅读了!
  11. VBE开源插件Rubberduck
  12. Iphone连接Openwrt的IPSEC服务器
  13. 如何保养笔记本的电池
  14. 寂然安静到鸿蒙翻译,明道篇
  15. python实现统计一个字符串中出现的字母和该字母出现的次数
  16. 拓嘉辰丰电商:拼多多宝贝排名查询方法
  17. CVE-2018-0802个人浅析
  18. python microbit typeerror_Microbit python无效语法
  19. 江西理工大学教育邮箱登录(2021年)
  20. flink onTimer定时器实现定时需求

热门文章

  1. ZigBee,ZStack
  2. 解决Eclipse中SVN版本比较中文乱码问题
  3. React总结篇之六_React高阶组件
  4. MySQL专题—— 从认识索引到理解索引【索引优化】
  5. sprint计划会议
  6. 一个nuxt(vue)+mongoose全栈项目聊聊我粗浅的项目架构
  7. Windows中添加自己的程序到开机启动中(添加服务,添加注册表)
  8. 使用Q进行同步的Promises操作
  9. Log保存文件-Android
  10. 理解 TCP(五):可靠性交付的实现