实验四 派生和继承

文章探讨了C++中基类和派生类的数据成员访问权限如何影响程序运行,包括private、protected的使用及其带来的错误。同时,给出了一个学生和教师数据处理的完整程序实例以及多重继承的教师干部类设计。
摘要由CSDN通过智能技术生成

1.输入下列程序。

#include<iostream>

using namespace std;

class Base{

public:

  void setx(int i)

  {x=i;}

  int getx()

  {return x;}

public:

  int x;

};

class Derived:public Base{

public:

  void sety(int i)

  {y=i;}

  int gety()

  {return y;}

  void show()

  {cout<<"Base::x="<<x<<endl;}

public:

  int y;

};

int main()

{ Derived bb;

  bb.setx(16);

  bb.sety(25);

    bb.show ();

  cout<<"Base::x="<<bb.x<<endl;

  cout<<"Derived::y="<<bb.y<<endl;

  cout<<"Base::x="<<bb.getx ()<<endl;

  cout<<"Derived::y="<<bb.gety ()<<endl;

  return 0;

}

写出程序的运行结果。

按以下要求,对程序进行修改后再调试,指出调试中出错的原因。

  ①将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?为什么?

②将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什么?

③在原程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?

④在原程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?

要求:写出程序,并调试程序,要给出测试数据和实验结果。

1.(1)cout << "Base::x=" << bb.x << endl

会出错;因为此时派生类derived并没有继承基类的private数据成员x,因此在类外并不能之间访问;

cout << "Base::x=" << x << endl;

也会出错,因为此时x为基类的私有成员,因此派生类不能继承private的数据成员,因此在派生类中也不能访问x。总之一句话,私有数据成员不能继承,因此不能在类内和类外直接访问。

(2)cout << "Base::x=" << bb.x << endl;

会出错,因为为protected继承,所以可以在类内可以直接访问,但不能在类外直接访问。

(3)bb.setx(16);

cout << "Base::x=" << bb.x << endl;

cout << "Base::x=" << bb.getx() << endl;

会出错,因为为private继承,所以基类的所有成员都为派生类的private成员,在类外不能直接访问。

(4)bb.setx(16);

cout << "Base::x=" << bb.x << endl;

cout << "Base::x=" << bb.getx() << endl;

会出错因为为protected继承,此时基类的public和protected都为派生类的protected成员,在类内可以直接访问,但是在类外不可以直接访问。

2、编写一个学生和教师数据输入和显示程序,要求:

(1)学生数据有编号、姓名、班号和成绩。

(2)教师数据有编号、姓名、职称和部门。

(3)将编号、姓名的输入和显示设计成类person,作为学生数据操作类student和教师数据操作类teacher的基类。

请完成程序设计、调试、并输出结果。

​
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
	Person(string n, string na)
	{
		number = n;
		name = na;
	}
	void show()
	{
		cout << "number:" << number << endl;
		cout << "name:" << name << endl;
	}
private:
	string number;
	string name;
};
class Student:public Person
{
public:
	Student(string n, string na, string c, string s) :Person(n, na)
	{
		clasm = c;
		score = s;
	}
	void show()
	{
		Person::show();
		cout << "clasm:" << endl;
		cout << "score:" << score << endl;
	}
private:
	string clasm;    
	string score;
};
class Teacher:public Person
{
public:
	Teacher(string n, string na, string t, string s):Person(n,na)
	{
		title = t;
		sector = s;
	}
	void show()
	{
		Person::show();
		cout << "title:" << title << endl;
		cout << "secto:" << sector << endl;
	}
private:
	string title;     
	string sector;   
};
int main()
{
	Student stu1("2306001", "王麻子", "16", "99");
	stu1.show();
	cout << "-------------------------------" << endl;
	Teacher tea1("123456", "张三", "高级教师", "德育处");
	tea1.show();
	return 0;
}

​

 

3、分别定义Teacher(教师)类和Cadre(干部)类,采用多重继承的方法由这两个类派生出新类Teacher_Cadre(教师干部类)。要求:

(1)在两个基类中都包含姓名、年龄、性别、地址、电话等数据成员。

(2)在Teacher(教师)类还包含数据成员Title(职称),在Cadre(干部)类中还包含数据成员post(职务)。在Teacher_Cadre(教师干部类)中包含数据成员wages(工资)。

(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在引用这些数据成员时,指定作用域。

(4)在类体中声明成员函数,在类外定义成员函数。

(5)在派生类Teacher_Cadre(教师干部类)的成员函数show中调用Teacher(教师)类中的display函数,输出姓名、年龄、性别、职称、地址、电话,然后再用cout语句输出职务和工资。

#include<iostream>
#include<string>
using namespace std;

class Teacher
{
public:
    Teacher(string n, string y, string s, string nu, string a, string t);
    void display();
private:
    string name;
    string year;
    string sec;
    string number;
    string address;
    string title;
};

class Cadre
{
public:
    Cadre(string p);
    void display();
private:
    string post;
};

class Teacher_Cadre : public Teacher, public Cadre
{
public:
    Teacher_Cadre(string n, string y, string s, string nu, string a, string t, string w, string p);
    void show();
private:
    string wages;
};

Teacher::Teacher(string n, string y, string s, string nu, string a, string t)
{
    name = n;
    year = y;
    sec = s;
    number = nu;
    address = a;
    title = t;
}

void Teacher::display()
{
    cout << "姓名:" << name << endl;
    cout << "年龄:" << year << endl;
    cout << "性别:" << sec << endl;
    cout << "编号:" << number << endl;
    cout << "地址:" << address << endl;
    cout << "职称:" << title << endl;
}

Cadre::Cadre(string p)
{
    post = p;
}

void Cadre::display()
{
    cout << "职务:" << post << endl;
}

Teacher_Cadre::Teacher_Cadre(string n, string y, string s, string nu, string a, string t, string p, string w)
    : Teacher(n, y, s, nu, a, t), Cadre(p), wages(w)
{
}

void Teacher_Cadre::show()
{
    Teacher::display();
    Cadre::display();
    cout << "工资:" << wages << endl;
}

int main()
{
    Teacher_Cadre tc("张三", "18", "男", "2306001", "四川省成都市郫都区","正国级","国防部部长", "35000");
    tc.show();
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值