第7次上机
实验目的:
1.掌握类的继承的概念和使用方法。
实验内容:
7—5定义一个基类 Shape,在此基础上派生出Rectangle和Circle,二者豆油getArea()函数计算对象的面积,使用Rectangle类创建一个派生类Square 1)Shape类设计:
?根据分析,从Shape类中派生出了Rectangle和Circle,从Rectangle派生出了Square,这三个派生类之间没有共同的属性,所以Shape类可以不设计数据成员,而函数成员为GetArea(),函数体为为空
2)Rectangle类的数据成员有长和宽,函数成员有:构造函数,设置和获取函数,重载Shape类中的GetArea()来求面积
3)Rectangle类的数据成员有半径,函数成员有:构造函数,设置和获取函数,重载Shape类中的GetArea()来求面积
4)Square类从Rectangle类继承,吸收了Rectangle的长和宽,所以可以考虑用构造函数将长和宽设置相等的值,构成边长,而吸收过来的GetArea()函数不需要做修改。
参考答案:
#include
public: void GetArea() { } };
//定义矩形类
class Rectangle:public Shape {
private: int lenth; int width; public: Rectangle(int l,int w) { lenth = l;width = w;} double GetArea() { return lenth * width ;} };
//定义圆类
class Circle:public Shape {
private: double radius; public: Circle(double r) { radius = r;}
double GetArea() { return 3.14 * radius * radius;} };
//定义正方形类
class Square:public Rectangle {
public: Square(int a):Rectangle(a,a) { } };
void main(void) {
Rectangle rect(1,2); Circle cr(3); Square sq(4);
cout << \矩形的的面积是:\ cout << \圆的面积是:\
cout << \正方形的面积是:\}
说明:Shape类的作用:主要是为了统一处理,比如:Shape *p ; p ->GetArea()形式,第八章会用到这样的技术。
课后习题7-6 定义一个动物类 Mammal,再由此派生出狗类Dog,定义Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。 //分析:
Mammal的设计:描述一般动物具有的特征,有颜色,体重,年龄等,会发声,有一般的设置函数和获取函数。
Dog的设计:除了具有一般动物的特征,还有尾巴个数,会汪汪叫,会摇尾巴,会咬人,有一般的设置函数和获取函数。
参考答案:
#include
char m_color[20]; int m_weight;
public: };
void Mammal::SetColor(char color[20]) {
strcpy(m_color,color); }
void Mammal::SetWeight(int weight) { }
char * Mammal::GetColor(){ return m_color;} int Mammal::GetWeight() { return m_weight;} Mammal::Mammal(char color[20],int weight) { }
Mammal::~Mammal()
SetColor(color); SetWeight(weight);
cout << \调用Mammal的构造函数\ m_weight = weight;
void SetColor(char color[20]); void SetWeight(int weight); char *GetColor(); int GetWeight();
Mammal(char color[20],int weight); ~Mammal(); void CanSpeak();
{ }
void Mammal::CanSpeak() { }
class Dog:public Mammal { private:
int m_TailNum;
cout << \动物会发声\
cout << \调用Mammal的析构函数\
public: };
Dog::Dog(char color[20],int weight,int TailNum) :Mammal(color,weight) {
SetTailNum(TailNum);
cout << \调用Dog类的构造函数\}
Dog::~Dog() {
cout << \调用Dog类的析构函数\}
int Dog::GetTailNum(){ return m_TailNum;}
void Dog::SetTailNum(int tailNum) { m_TailNum =tailNum;} void Dog::CanSpeak()
Dog(char color[20],int weight,int TailNum); ~Dog();
void SetTailNum(int tailNum); int GetTailNum(); void CanSpeak(); void CanWagTail(); void CanHurtPeople();
{ }
void Dog::CanWagTail(){ cout << \狗会摇尾巴\void Dog::CanHurtPeople(){cout << \狗会咬人\
void main(void) {
//结果分析:先调用基类的构造函数(先祖先),在调用自己的构造函数(再自己),析构函数的调用顺序和构造函数的调用顺序刚好相反
课后习题7-7 定义一个基类和派生类,在构造函数中输出提示信息,构造派生类的对象,观察构造函数的执行情况: 参考答案:
#include
class Derived:public Base { public:
Derived() { cout << \调用派生类的构造函数\~Derived() { cout << \调用派生类的析构函数\Base() { cout << \调用基类的构造函数\~Base(){ cout << \调用基类的析构函数\Dog dog(\白色\
cout <<\狗的颜色:\cout << \狗的体重:\cout << \狗的尾巴个数:\dog.CanHurtPeople(); dog.CanSpeak(); dog.CanWagTail();
cout << \狗会汪汪叫\