1. 友元函数
什么时候使用友元函数
- [1] 两个类要共享数据的时候
- [2] 运算符重载的某些场合需要使用友元
- 友元函数允许其他类访问该类的公有、私有和保护成员
友元函数的优缺点
- 优点:能够提高效率,表达清晰简单
- 缺点:友元函数破环了封装机制,除非不得已的情况下才使用友元函数
友元函数的位置和调用
- 友元函数是类外的函数,其声明可以放在类的私有段或公有段且没有区别
- 可以直接调用友元函数,不需要通过对象或指针
友元函数的分类
[1] 普通友元函数
- 声明:friend + 普通函数声明
- 实现:可以在类内也可以在类外实现
- 调用:直接调用,与普通函数类似
[2] 类X的成员函数作为类Y的友元函数
- 声明:声明在公有public中,friend + 成员函数声明
- 调用:先定义X的对象x,使用X调用自己的成员函数,自己的成员函数中使用了友元机制
[3] 类X的所有成员函数作为类Y的友元函数(友元类)
- 声明:可声明在公有或私有位置,常写为私有。friend + 类名
- 实现:
class girl
{
private:
char *name;
int age;
friend class boy; //声明类boy是类girl的友元
};
class boy
{
...
};
友元函数与类的成员函数的区别
成员函数有this指针,友元函数没有this指针
友元函数是不能被继承的。父亲的朋友未必是儿子的朋友
2. 基类和派生类
继承
- 通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员
基类和派生类
我们称已存在的用来派生新类的类为基类,又称父类
由已存在的类派生出的新类称为派生类,又称子类
派生类的格式
在上一篇文章中我们已经介绍了,常用继承方式有三种:公有继承 + 私有继承 + 保护继承单继承格式
多继承格式
//单继承:派生类名-新定义的一个类的名字,继承方式-public/private/protected
class <派生类名>:<继承方式><基类名>
{
<派生类新定义成员>;
};
//多继承:多继承的基类多于一个
class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,...
{
<派生类新定义的成员>;
};
- 派生类举例
class A
{
public:
int m;
};
class B:public A
{
public:
int n;
};
A a; //类A的对象
B b;
a = b; //对象直接赋值
注:基类对象和派生类对象之间的赋值仅仅是对应的成员变量的赋值,不会影响成员函数,不会影响this指针
基类和派生类的关系
基类和派生类是相对而言的,任何一个类都可以派生出新类,派生类也可以再派生出新类。- [1] 派生类是基类的具体化
- 类的层次通常反映了客观世界中某种真实的模型
- 基类是对若干个派生类的抽象,而派生类是基类的具体化
- 基类抽取了它的派生类的公共特征,而派生类通过增加行为将抽象类变为某种有用的类型
- 举例:人类作为基类,有姓名年龄体重等基本属性;学生增加了基类中没有的一些属性如学校、班级、学号等,也增加了一些基类中没有的行为如上课、考试等。学生就可以看作人类这个基类的派生类(或称子类),在学生的基础上还可以进一步扩展,比如研究生又可以作为一个新的派生类。
- [2] 派生类是基类定义的延续
- 抽象基类中有些操作未实现,在派生类中实现基类中定义的操作,这种情况派生类可看作基类的延续
- 举例:虚函数就属此类情况
- [3] 派生类是基类的组合
- 在多继承时,一个派生类有多个基类,这时派生类将是所有基类行为的组合。
- [1] 派生类是基类的具体化
Acknowledgements:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
http://www.cnblogs.com/noble/p/4144147.html
2017.09.25