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;
}