第7章  继承与派生

7-5 定义一个基类 Shape,在此基础上派生出 Rectangle 和 Circle,二者都有 getArea()函数计算对象的面积。使用 Rectangle类创建一个派生类 Square。

#include <iostream>
using namespace std;class Shape {
public:virtual float getArea() = 0;      //纯虚函数 Shape() { }                  //构造函数不能是虚函数 virtual ~Shape() {}       //虚析构函数,先调用释放派生类的空间,然后再释放基类的内存空间。
};class Rectangle:public Shape{private:float length;float wide;public:Rectangle(float l,float w){length=l;wide=w;}virtual float getArea(){return length*wide;}
};
class Circle:public Shape{private:float R; public:Circle(float r){R=r;}float getArea(){return 3.14*R*R;}
};
class Square:public Rectangle{public:Square(float x):Rectangle(x,x){}
};
int main( )
{Shape *ps;ps = new Circle( 5 );cout << "The area of the Circle is " << ps->getArea() << endl;delete ps;ps = new Rectangle( 5, 6 );cout << "The area of the Rectagle is " << ps->getArea() << endl;delete ps;ps = new Square( 5 );      cout << "The area of the Square is " << ps->getArea() << endl;delete ps;  return 0;
}
  • 一旦基类中有带参数的构造函数,派生类中则必须有显式传参的派生类构造函数,来实现基类中参数的传递,完成初始化工作。
  • 纯虚函数声明之后,基类中就可以不再给出函数的实现部分。纯虚函数的函数体由派生类给出。该纯虚函数所在的类是抽象类,不能直接进行实例化。
  • 构造函数不能是虚函数。
  • 虚析构函数实现了析构函数的多态,能避免内存泄露,防止派生类对象中动态分配的内存空间没有得到释放。这个时候多态效应出现,会先调用释放派生类的空间,然后再释放基类的内存空间。

7-6 定义一个哺乳动物类 Mammal,再由此派生出狗类 Dog,定义一个 Dog 类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。

#include <iostream>
using namespace std;
class Mammal{private:int age;double weight;public:Mammal(){cout << "Constructor in Mammal.\n";}~Mammal(){cout << "Destructor in Mammal.\n";}void setAge(int a) {age=a;}int getAge(){return age;}void setWeight(double w) {weight=w;}double getWeight(){return weight;}};
class Dog:public Mammal{private:string color;public:Dog(){cout << "Constructor in Dog.\n";}~Dog(){cout << "Destructor in Dog.\n";}void setColor(string s){color = s;}string getColor(){return color;}void speak(){cout << "Dog sound wang,wang,wang!\n";}
};
int main() {Dog d;d.setAge( 4 );d.setWeight( 12 );d.setColor( "Black" );cout << d.getAge() << endl;cout << d.getWeight() << endl;cout << d.getColor() << endl;d.speak();return 0;
}
  • 构造函数调用顺序:基类->派生类
  • 析构函数调用顺序:派生类->基类

7-7 定义一个基类及其派生类,在构造函数中输出提示信息,构造派生类的对象,观察构造函数的执行情况。

#include<iostream>
using namespace std;
class Clock
{
private:int H;int M;int S;
public:Clock(){cout<<"Clock's Constructor Called!"<<endl;}};class AlarmClock:public Clock
{
private:int AH;int AM;
public:AlarmClock(){cout<<"AlarmClock's Constructor Called!"<<endl;}};int main()
{AlarmClock A;return 0;
}

7-8 定义一个 Document类,有数据成员 name,从 Document派生出 Book 类,增加数据成

员 pageCount。

#include <iostream>
#include <string>
using namespace std;class Document{public:Document(string aname):name(aname){cout << "Constructing Document" << endl;}    ~Document(){cout << "Destructing Document" << endl;}protected:string name;   //保护成员,派生类可访问到
};
class Book:public Document{public:Book(string aname,int apageCount):Document(aname),pageCount(apageCount){cout << "Constructing Book" << endl;}~Book(){cout << "Destructing Book" << endl;}void print(); private:int pageCount;
};
void Book::print()
{cout<<name<<": "<<pageCount<<"页"<<endl;
}
int main()
{Document a("骆驼祥子"); Book b("朝花夕拾",200);b.print(); return 0;
}

派生类的成员函数可以访问基类的保护成员或公有成员。故代码中将基类Document的成员name设置为保护成员,。

Book这样Book类就继承了 Document类的成员,也就实现了代码的重用,同时通过新增成员pageCount,加入了自身的独有特征,达到了程序的扩充。

7-9 定义一个基类 Base,有两个公有成员函数 fn1(),fn2(),私有派生出 Derived 类,如何通过 Derived 类的对象调用基类的函数 fn1()?

#include <iostream>
using namespace std;class Base{  //基类Basepublic:int fn1(){return 1;}int fn2(){return 2;}
};
class Derived:private Base{  //私有派生类Derived;public:int fn1(){cout<<Base::fn1()<<endl;}//返回Base类中函数fn1,以调用fn1;int fn2(){cout<<Base::fn2()<<endl;}//返回Base类中函数fn2,以调用fn2;
};
int main(){Derived a;//定义一个参数a;a.fn1(); //调用Derived类中的fn1函数,fn1返回值调用Base类的fn1函数;a.fn2(); //调用Derived类中的fn2函数,fn2返回值调用Base类的fn2函数;return 0;
}

如果要访问被隐藏的成员,就需要使用作用域分辨符和基类名来限定。

7-10 定义一个 Object类,有数据成员 weight及相应的操作函数,由此派生出 Box 类,增加数据成员 height和 width 及相应的操作函数,声明一个Box对象,观察构造函数与析构函数的调用顺序。

#include<iostream>
using namespace std;class object {private:int weight;public:object() {weight=0;cout << "obj的构造函数" << endl;}void setWight(int w){weight=w;}~object() {cout << "obj的析构函数" << endl;}
};class box :public object{private:int height, width;public:box() {height=width=0; cout << "box的构造函数" << endl;}void setHeight(int h){height=h;}void setWidth(int w){width=w;}~box() {cout << "box的析构函数" << endl;}
};int main()
{box b;return 0;
}

7-11 定义一个基类 BaseClass,从它派生出类 DerivedClass。BaseClass 有成员函数fn1(),fn2(),DerivedClass 也有成员函数 fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用 DerivedClass的对象以及 BaseClass和 DerivedClass 的指针来调用fn1(),fn2(),观察运行结果。

#include<iostream>
using namespace std;class BaseClass{public:void fn1(){cout<<"基类的 fn1()"<<endl;}void fn2(){cout<<"基类的 fn2()"<<endl;}
};
class DerivedClass:public BaseClass{public:void fn1(){cout<<"派生类的 fn1()"<<endl;}void fn2(){cout<<"派生类的 fn2()"<<endl;}
};
int main()
{DerivedClass d;d.fn1();d.fn2();BaseClass *p1 =&d;p1->fn1();p1->fn2();DerivedClass *p2=&d;p2->fn1();p2->fn2();return 0;
}

本专栏为本人大二C++课程的习题作业和一些学习经验的分享,供大家参考学习。如有侵权请立即与我联系,我将及时处理。


参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊、C++语言程序设计 第五版 -清华大学出版社- 郑莉,董渊(学生用书)

编译环境:Visual Studio 2019、Dev-C++

C++语言程序设计第五版 - 郑莉(第七章课后习题)相关推荐

  1. C++语言程序设计第五版 - 郑莉(第九章课后习题)

    第9章  群体类和群体数据的组织 9-1 编写程序提示用户输入一个班级中的学生人数 n,再依次提示用户输入 n 个人在课程 A 中的考试成绩,然后计算出平均成绩,显示出来.请使用本书第 9 章中的数组 ...

  2. C++语言程序设计第五版 - 郑莉(第二章课后习题)

    第2章  C++简单程序设计 2-25 编写一个完整的程序,实现功能:向用户提问"现在正在下雨吗?",提示用户输入Y 或N.若输入为Y,显示"现在正在下雨.": ...

  3. C++语言程序设计第五版 - 郑莉(第八章课后习题)

    第8章 多态性 8-4 请编写一个计数器 Counter类,对其重载运算符"+". #include <iostream> using namespace std;cl ...

  4. 郑莉版java第三章答案_java语言程序设计(郑莉)第七章课后习题答案.docx

    java语言程序设计(郑莉)第七章课后习题答案.docx 还剩 10页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: if (matrix.isTria ...

  5. 第三章 函数 C++语言程序设计第五版 - 郑莉

    本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉 B站视频:https://space.bilibili.com/702528832/video PPT与代码已 ...

  6. C++语言程序设计第五版 - 郑莉-绪论(一)

    本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉 B站视频:https://space.bilibili.com/702528832/video PPT与代码已 ...

  7. C++语言程序设计第五版 - 郑莉(第六章课后习题)

    第6章   数组.指针与字符串 6-20 实现一个名为 SimpleCircle 的简单圆类.其数据成员 int* itsRadius 为一个指向其半径值的指针,存放其半径值.设计对数据成员的各种操作 ...

  8. C++语言程序设计第五版 - 郑莉(第四章课后习题)

    第4章  类与对象 4-9设计并测试一个名为rectangle的矩形类,其属性为矩形的左下角与右上角坐标,根据坐标能计算矩形的面积. #include <iostream> using n ...

  9. C++语言程序设计第五版 - 郑莉(第五章课后习题)

    第5章  数据的共享与保护 5-7定义一个Cat类,拥有静态数据成员 numOfCats,记录Cat的个体数目:静态成员函数getNumOfCats(),读取numOfCats.设计程序测试这个类,体 ...

最新文章

  1. 世界应该多点理解关爱,少点争吵
  2. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-目录
  3. inputstream的大小为0_李太阳2020302期排列三推荐:本期两码看好0、3
  4. Sharepoint client model 中出现Cannot invoke HTTP DAV request. There is a pending query 的解决办法...
  5. C# webkit内核 网页填表
  6. php猴子找大王算法,教程方法;php实现猴子选大王问题算法实例电脑技巧-琪琪词资源网...
  7. Android SlidingMenu开源库及其使用
  8. ndarray python 映射_NDArray — 基于Java的N维数组工具
  9. End-to-end目标检测算法的学习笔记
  10. paip.验证码识别----判断汉字还是英文
  11. spss中的aic值计算_常用SPSS数据处理方法,你都会吗?
  12. android listview viewstub,Android中使用ViewStub提高布局性能
  13. navicat 12 for mac 中文破解版使用说明
  14. Mybatis| Bug合集
  15. Linux种修改用户主目录命令,usermod命令怎么修改用户主目录
  16. 元学习之《On First-Order Meta-Learning Algorithms》论文详细解读
  17. DNF服务器该如何选择?
  18. 异构计算(CPU + GPU)编程简介
  19. 厦门有哪些靠谱的互联网公司
  20. 一千万条数据去重_DB2千万级数据去重

热门文章

  1. 计算机内无法使用搜狗,电脑无法在Word文档中使用搜狗拼音输入法怎么办
  2. 梅贾的窃魂卷(吉首大学新星杯 C题)
  3. creo打不开stp文件_Creo编辑处理STP文件的方法
  4. 电子工程师名片——UFI Command,USB盘符的显示
  5. 疯狂Java讲义(七)----第一部分
  6. 基于HTML和JavaScript的小鱼冒险网页游戏设计
  7. 【邮箱问题】无法登录邮箱、需要绑定手机(解决方法)
  8. shell调用c程序,求子网掩码
  9. Artanis: 工作日志自动收发系统
  10. 华为业绩继续逆势增长,给员工分红400亿