一 为什么需要:
把共性的东西生成一个母类,然后再派生,方便。
类和类有三种关系:没有关系,继承关系,符合关系。
二 格式
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)
回复