第7讲继承与派生.docx
- 文档编号:17671274
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:14
- 大小:17.35KB
第7讲继承与派生.docx
《第7讲继承与派生.docx》由会员分享,可在线阅读,更多相关《第7讲继承与派生.docx(14页珍藏版)》请在冰点文库上搜索。
第7讲继承与派生
第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
classShape
{
public:
voidGetArea(){}
};
//定义矩形类
classRectangle:
publicShape
{
private:
intlenth;
intwidth;
public:
Rectangle(intl,intw){lenth=l;width=w;}
doubleGetArea(){returnlenth*width;}
};
//定义圆类
classCircle:
publicShape
{
private:
doubleradius;
public:
Circle(doubler){radius=r;}
doubleGetArea(){return3.14*radius*radius;}
};
//定义正方形类
classSquare:
publicRectangle
{
public:
Square(inta):
Rectangle(a,a){}
};
voidmain(void)
{
Rectanglerect(1,2);
Circlecr(3);
Squaresq(4);
cout<<"矩形的的面积是:
"< cout<<"圆的面积是: "< cout<<"正方形的面积是: "< } 说明: Shape类的作用: 主要是为了统一处理,比如: Shape*p;p->GetArea()形式,第八章会用到这样的技术。 课后习题7-6定义一个动物类Mammal,再由此派生出狗类Dog,定义Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。 //分析: Mammal的设计: 描述一般动物具有的特征,有颜色,体重,年龄等,会发声,有一般的设置函数和获取函数。 Dog的设计: 除了具有一般动物的特征,还有尾巴个数,会汪汪叫,会摇尾巴,会咬人,有一般的设置函数和获取函数。 参考答案: #include #include classMammal { private: charm_color[20]; intm_weight; public: voidSetColor(charcolor[20]); voidSetWeight(intweight); char*GetColor(); intGetWeight(); Mammal(charcolor[20],intweight); ~Mammal(); voidCanSpeak(); }; voidMammal: : SetColor(charcolor[20]) { strcpy(m_color,color); } voidMammal: : SetWeight(intweight) { m_weight=weight; } char*Mammal: : GetColor(){returnm_color;} intMammal: : GetWeight(){returnm_weight;} Mammal: : Mammal(charcolor[20],intweight) { SetColor(color); SetWeight(weight); cout<<"调用Mammal的构造函数"< } Mammal: : ~Mammal() { cout<<"调用Mammal的析构函数"< } voidMammal: : CanSpeak() { cout<<"动物会发声"< } classDog: publicMammal { private: intm_TailNum; public: Dog(charcolor[20],intweight,intTailNum); ~Dog(); voidSetTailNum(inttailNum); intGetTailNum(); voidCanSpeak(); voidCanWagTail(); voidCanHurtPeople(); }; Dog: : Dog(charcolor[20],intweight,intTailNum) : Mammal(color,weight) { SetTailNum(TailNum); cout<<"调用Dog类的构造函数"< } Dog: : ~Dog() { cout<<"调用Dog类的析构函数"< } intDog: : GetTailNum(){returnm_TailNum;} voidDog: : SetTailNum(inttailNum){m_TailNum=tailNum;} voidDog: : CanSpeak() { cout<<"狗会汪汪叫"< } voidDog: : CanWagTail(){cout<<"狗会摇尾巴"< voidDog: : CanHurtPeople(){cout<<"狗会咬人"< voidmain(void) { Dogdog("白色",5,1); cout<<"狗的颜色: "< cout<<"狗的体重: "< cout<<"狗的尾巴个数: "< dog.CanHurtPeople(); dog.CanSpeak(); dog.CanWagTail(); //结果分析: 先调用基类的构造函数(先祖先),在调用自己的构造函数(再自己),析构函数的调用顺序和构造函数的调用顺序刚好相反 课后习题7-7定义一个基类和派生类,在构造函数中输出提示信息,构造派生类的对象,观察构造函数的执行情况: 参考答案: #include classBase { public: Base(){cout<<"调用基类的构造函数"< ~Base(){cout<<"调用基类的析构函数"< }; classDerived: publicBase { public: Derived(){cout<<"调用派生类的构造函数"< ~Derived(){cout<<"调用派生类的析构函数"< }; voidmain(void) { Derivedd; //定义对象,会调用Derived类的构造函数,但调用 //Derived的构造函数之前,会先隐含调用基类Base //的构造函数 //析构函数的调用顺序和构造函数的调用顺序相反 } 7-8定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员PageCount #include #include classDocument { private: char*m_name; public: Document(char*name); Document(){m_name=NULL;cout<<"调用Document的默认构造函数"< ~Document(); char*GetName(); voidSetName(char*name); }; Document: : Document(char*name) { m_name=newchar[strlen(name)+1]; SetName(name); cout<<"调用Document的非默认构造函数"< } Document: : ~Document() { if(m_name! =NULL) { delete[]m_name; m_name=NULL; } cout<<"调用Document的析构函数"< } char*Document: : GetName(){returnm_name;} voidDocument: : SetName(char*name) { if(m_name==NULL) { m_name=newchar[strlen(name)+1]; } strcpy(m_name,name);} classBook: publicDocument { private: intm_pageCount; public: Book(char*name,intpageCount); Book(){cout<<"调用Book的默认构造函数"< ~Book(); intGetPageCount(); voidSetPageCount(intpageCount); }; Book: : Book(char*name,intpageCount): Document(name) { SetPageCount(pageCount); cout<<"调用Book的非默认构造函数"< } Book: : ~Book(){cout<<"调用Book的析构函数"< intBook: : GetPageCount(){returnm_pageCount;} voidBook: : SetPageCount(intpageCount){m_pageCount=pageCount;} voidmain(void) { Bookbook1; book1.SetName("程序设计"); book1.SetPageCount(800); cout<<"书名: "< cout<<"页数: "< cout<<"*******************************"< Bookbook2("c++程序设计",600); cout<<"书名: "< cout<<"页数: "< } 7—10定义一个Object类,有数据成员weight以及相应的操作函数,由此派生出Box类,增加数据成员height和width以及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。 参考答案: #include classObject { private: intm_weight; public: Object(); Object(intweight); intGetWeight(); voidSetWeight(intweight); ~Object(); }; Object: : Object(){cout<<"调用Object的默认构造函数"< Object: : Object(intweight): m_weight(weight){cout<<"调用Object的非默认构造函数"< intObject: : GetWeight(){returnm_weight;} voidObject: : SetWeight(intweight){m_weight=weight;} Object: : ~Object(){cout<<"调用Object的析构函数"< classBox: publicObject { private: intm_height; intm_width; public: Box(); Box(intweight,intheight,intwidth); voidSetHeight(intheight); voidSetWidth(intwidth); intGetHeight(); intGetWidth(); ~Box(); }; Box: : Box(){cout<<"调用Box的默认构造函数"< Box: : Box(intweight,intheight,intwidth): Object(weight) { SetWeight(weight); SetHeight(height); cout<<"调用Box的非默认构造函数"< } voidBox: : SetHeight(intheight){m_height=height;} voidBox: : SetWidth(intwidth){m_width=width;} intBox: : GetHeight(){returnm_height;} intBox: : GetWidth(){returnm_width;} Box: : ~Box(){cout<<"调用Box的析构函数"< voidmain(void) { Boxbox1; box1.SetWeight(100); box1.SetHeight(10); box1.SetWidth(20); cout<<"箱子的重量: "< cout<<"箱子的长: "< cout<<"箱子的宽: "< Boxbox2(200,30,40); cout<<"箱子的重量: "< cout<<"箱子的长: "< cout<<"箱子的宽: "< } 7-11定义一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2(),在主函数中声明一个DeviredClass的对象,分别用DeviredClass的对象以及BasClass和DeviredClass的指针来调用fn1()和fn1(),观察运行结果。 #include classBaseClass { public: voidfn1(){cout<<"调用基类的fn1函数"< voidfn2(){cout<<"调用基类的fn2函数"< }; classDerivedClass: publicBaseClass { public: voidfn1(){cout<<"调用派生类的的fn1函数"< voidfn2(){cout<<"调用派生类的fn2函数"< }; voidmain(void) { DerivedClassderive; DerivedClass*pDerive; BaseClass*pBase; //1)通过派生类的对象来调用 derive.fn1(); derive.fn2(); //2)通过指向派生类对象的派生的指针来调用 pDerive=&derive; pDerive->fn1(); pDerive->fn2(); //3)通过指向派生类对象的基类的指针来调用 pBase=&derive; pBase->fn1(); pBase->fn2(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承 派生