知乎:C++——继承和派生

用户头像
来自上海海洋大学-韦锡海发布于:2020-07-14 21:47:50
一 为什么需要: 把共性的东西生成一个母类,然后再派生,方便。 类和类有三种关系:没有关系,继承关系,符合关系。 二 格式 class 派生类名:public 基类名 { …… }; 三 例子: #include #include using namespace std; /* 派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public。 派生类的各个成员函数中,不能访问基类中的private成员。 (虽然继承,但是不能访问) ----------------------------- 格式: class 派生类名:public 基类名 { …… }; ----------------------------- */ class CStudent{ private: string sName; int Age; public: bool IsThreeGood(){}; void SetName(const string & name){ sName = name; } //…… }; class CUndergraduateStudent:public CStudent { private: int nDepartment; public: bool IsThreeGood(){};//覆盖 bool CanBaoYan(){}; }; class CGraduateStudent:public CStudent { private: int nDepartment; char szMe*rName[20]; public: int CountSalary(){}; }; /* 派生类对象中,包含基类对象,基类存储位置位于派生类新增成员变量之前 */ 四:深入思考一些细节: 1.继承与复合——思考继承关系是否是合理? /* B是A的派生类,逻辑上要求:一个B对象也是一个A对象。 C和D是复合关系,逻辑上要求:D是C的固有属性。例如圆心是一个点,但是是圆的固有属性。 */ /* 错误举例1:从男人类中派生一个女人类出来 错误举例2:不要在应该复合的地方强行继承 class CPoint{ double x,y; }; ------------ class CCircle:public CPoint{ double r; }; ------------ 应该为: class CCircle{ double r; CPoint center; }; */ 2.更复杂的复合关系: 本系列所有想法均来自 北大网上课程——C++程序设计实习,主讲人 郭炜和刘家瑛。 例子: 小区养*理程序——需要“业主”类和“狗”类 狗有主人, 主人有多条狗,这种有来有往的伪复合关系(因为狗很难成为人的固有属性,狗需要自由!!),有以下几种思路: /* class CDog; class CMaster{ CDog dogs[10]; }; class CDog{ CMaster m; }; 循环定义了,叉掉 ----------------- class CDog; class CMaster{ CDog *dogs[10]; }; class CDog{ CMaster m; }; 如果我改变一条狗的主人信息,那么具有相同主人的不同狗也要修改它们的主人信息, 维护相同主人的多条狗里面所包含的相同主人(不同对象)的信息的一致性是一件很罗嗦 的事情,叉掉 ----------------- class CMaster; class CDog{ CMaster *pm; }; class CMaster{ CDog dogs[10]; }; 狗不自由啊,叉掉(稍微比前面的好点)。 ----------------- 正确写法:互相约制:(又称知道关系) class CMaster; class CDog{ CMaster *pm; }; class CMaster{ CDog *dog[10]; }; 狗很容易找到主人,但是很自由(我可以随便换主人啊); 主人很容易找到自己的狗; */ 注释还是不要看了,越看越乱。。。。。。 总之,就是谁也不属于谁,谁也不完全自由,形成一个相互牵制的关系图。所以画一下图就懂了!! 2.继承了但是不能访问基类的私有成员,那么protected呢? 3. 派生类的构造函数怎么写?写一个,怎么衔接多个构造函数? 4. 继承的赋值问题,就是如果我把派生类赋值给基类会怎样?或者基类赋值给派生类?浅复制时候和深复制时候的区别? 5.基类和派生类都有的成员函数怎么处理? 6.析构函数的析构顺序? 待解决(9.26,21:54) 这是解决方案(9.27 18:39): /* 派生类和基类都有的话,首先考虑派生类,基类需要关键字base: base::变量名 */ /*私有:基类成员和友元 公有:所有 保护:基类成员和友元,派生类的成员函数可以访问当前对象的基类的保护成员 class Father{ protected: int nprotected; }; class Son::public Father{ nprotected = 1;//ok Son f; f.nprotected = 1;wrong,f不是当前对象 ------------------------------- 派生类的构造函数: 派生类交代基类初始化的格式: 构造函数名(形参表):基类名(基类构造函数实参表){} 例子: FlyBug::FlyBug(int legs, int color, int wings):Bug(legs, color){ nWings = wings; } --------------------------------- public继承的赋值兼容规则: class base{}; class derives:public base {}; base b; derived d; 1)派生类的对象可以赋值给基类对象: b=d; 2)派生类对象可以初始化基类引用: base & br = d; 3)派生类对象的地址可以赋值给基类指针: base *pb = &d; 机理: 直接基类和间接基类: 派生只需写出直接基类(可以传递); */ 编辑于 2016-09-27 著作权归作者所有 如下链接为原文: https://zhuanlan.zhihu.com/p/22*1962
点赞 (2) 回复
1F 用户头像
来自上海海洋大学-肖旋发布于:2020-07-15 17:31:28
讲的很清晰,对我很有帮助
加载更多
点击图片
取消
回复
2F 用户头像
来自福州大学-蒋佳敏发布于:2020-07-15 22:16:50
内容很舒适,棒
加载更多
点击图片
取消
回复
3F 用户头像
来自东华大学-柴茗峥发布于:2020-07-15 22:17:53
内容详细,收获颇多
加载更多
点击图片
取消
回复
4F 用户头像
来自上海海洋大学-尹煦淞发布于:2020-07-15 22:22:27
讲得很清楚
加载更多
点击图片
取消
回复
5F 用户头像
来自上海海洋大学-王博发布于:2020-07-15 22:25:13
内容引起极度舒适
加载更多
点击图片
取消
回复
6F 用户头像
来自上海海洋大学-吕雪尔发布于:2020-07-15 22:35:03
内容充实
加载更多
点击图片
取消
回复
7F 用户头像
来自上海海洋大学-程志伟发布于:2020-07-15 22:39:15
加载更多
点击图片
取消
回复
8F 用户头像
来自上海海洋大学-杨进龙发布于:2020-07-15 22:41:04

感谢分享

加载更多
点击图片
取消
回复
9F 用户头像
来自上海海洋大学-张邱义茨发布于:2020-07-15 22:52:23
wxs老师组织这个班群太有意义了,没有同学的这些帮助,我这门课肯定来不及复习
加载更多
点击图片
取消
回复
10F 用户头像
来自上海海洋大学-刘歆宇发布于:2020-07-15 22:55:48
感谢分享
加载更多
点击图片
取消
回复
11F 用户头像
来自上海海洋大学-朱江涛发布于:2020-07-15 23:00:16
感谢分享
加载更多
点击图片
取消
回复
12F 用户头像
来自上海海洋大学-季祥山发布于:2020-07-15 23:10:09
讲解清晰 很充实
加载更多
点击图片
取消
回复
13F 用户头像
来自上海海洋大学-刘煌棚发布于:2020-07-15 23:51:25
说的太对了
加载更多
点击图片
取消
回复
发布回复
点击图片