C++基础-友元函数和继承派生


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] 派生类是基类的组合
      • 在多继承时,一个派生类有多个基类,这时派生类将是所有基类行为的组合



Acknowledgements:
http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/04/2535305.html
http://www.cnblogs.com/noble/p/4144147.html

2017.09.25

你可能感兴趣的:(C/C++)