1 什么是继承继承概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段它允许程序员在保持原有类特性的基础上进行扩展增加功能。这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构体现了由简单到复杂的认知过程。面向对象的继承关系指类之间的父子关系。用类图表示如下2 为什么要有继承/ 继承的意义因为继承是面向对象中代码复用的一种手段。通过继承可以获取父类的所有功能也可以在子类中重写父类已有的功能 以及 添加父类中没有的功能。3如何理解 子类是特殊的父类因为子类不仅继承了父类所有的属性与行为而且在子类中还可以重写父类已有的功能以及添加自己的新属性与新方法。这也就是说子类对象可以当作父类对象使用。4 继承的规则1 子类是特殊的父类2 子类对象可以直接初始化父类对象3 子类对象可以直接赋值给父类对象5 继承中的访问级别1public在类的内部和外部都可以访问。2protected:可以在类的内部使用不可以在类的外部直接使用。但是存在继承关系时可以在子类中使用父类的protected的成员。3private只可以在类的内部使用不可以在类的外部使用。注类的内部在当前类的作用域中不包括子类的作用域类的外部类内部之外的作用域包括子类的作用域问题1子类是否可以直接访问父类中的private成员非公有成员吗No1从面向对象理论的角度分析可知子类拥有父类一切的属性与行为得出的结论Yes2从c的语法角度分析可知外界不能访问类的private成员得出的结论No问题2谈谈 protected关键字的存在的意义protected关键字是为继承而存在的这样就可以在子类中访问父类的protected成员同时还不允许外界直接访问父类中的protected成员。问题3在类中如何选择类的访问级别--- 见下图6 继承中的继承方式1public 继承方式 --- 父类成员在子类中保持原有的访问级别。2protected继承方式 ---父类中的公有成员在子类中变成了protected成员其它不变。3private 继承方式默认 --- 父类成员在子类中变成了private成员可归纳为结论无论选择哪种继承方式都不会影响子类访问父类成员的级别注1 c 工程项目中只使用 public 继承方式2 c 派生语言javec#只支持 public继承方式3protected、private 继承方式带来的复杂性远大于其实用性舍弃不用用代码实现类图中的功能代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596#include iostream#include string#include sstreamusingnamespacestd;classObject{protected:string mName;string mInfo;public:Object(){mName Object;mInfo ;}inlinestring getName(){returnmName;}inlinestring getInfo(){returnmInfo;}};classPoint :publicObject{private:intmX;intmY;public:Point(intx 0,inty 0){ostringstream oss;mX x;mY y;mName Point;oss Point( mX , mY );mInfo oss.str();}inlineintgetX(){returnmX;}inlineintgetY(){returnmY;}};classLine :publicObject{private:Point mP1;Point mP2;public:Line(Point p1, Point p2){mP1 p1;mP2 p2;mName Line;mInfo Line from p1.getInfo() to p2.getInfo();}inlinePoint getStartPoint(){returnmP1;}inlinePoint getEndPoint(){returnmP2;}};intmain(intargc,charconst*argv[]){Object obj;cout obj.getName() endl;cout obj.getInfo() endl endl;Point p1(1, 2);Point p2(3, 4);cout p1.getName() endl;cout p1.getInfo() endl;cout p2.getName() endl;cout p2.getInfo() endl endl;Line line(p1, p2);cout line.getName() endl;cout line.getInfo() endl endl;return0;}