类继承小总结

  • 类继承的功能
    1,在已有类的基础上添加功能。
    2, 可以给类增加数据。eg:对于一个表示人的类,可以派生一个类,添加人是否可以飞行这个数据成员(bool canfly;)
    3,可以修改类方法的行为。
  • 成员初始化语法
    对于以下的类,可以有两种定义构造函数的方法:
     1 class TableTennisPlayer
     2  {
     3      private:
     4          string firstname;
     5          string lastname;
     6          bool hasTable;
     7      public:
     8          TableTennisPlayer(const string & fn = "none",
     9                  const string & ln = "none", bool ht = false);
    10          ....
    11  }

    第一种,在函数体内初始化成员

    1 TableTennisPlayer::TableTennisPlayer(const string & fn, 
    2          const string & ln, bool ht)
    3  {
    4      firstname = fn;
    5      lastname = ln;
    6      hasTable = ht;
    7  }

    第二种,使用成员初始化列表语法

    1  TableTennisPlayer::TableTennisPlayer(const string & fn, 
    2          const string & ln, bool ht) : firstname(fn),
    3          lastname(ln), hasTable(ht)  {  }

    第一种方法首先为firstname调用string的默认构造函数,在调用string的复制运算符将firstname设置为fn。但是,初始化列表语法(第二种方法)会直接使用string的复制构造函数将firstname初始化为fn。很明显,初始化列表语法步骤少性能好,而且更简洁。

  • 那么派生类和基类的关系如何?这里就公有派生谈一下。
    1,派生类对象存储了基类的数据成员(派生类继承了基类的实现)(并不是所有派生类都回继承基类的实现)
    2,派生类对象可以使用基类的方法(派生类继承了基类的接口)
    使用公有派生,基类的公有成员将成为派生类的公有成员,基类的私有部分也成为派生类的一部分,但只能通过基类的公有和保护方法访问。
  • 需要在继承特征中添加什么呢
    1,派生类需要自己的构造函数。
    2,派生类可以根据需要添加额外的数据成员和成员函数。

  •  构造函数:访问权限的考虑
    派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问。也就是说,要想访问修改基类的私有成员,必须要通过派生类的对象调用方法。现在假设,我们要通过派生类的构造函数初始化基类的私有数据成员和派生类数据成员。有点像这样:(假设RatedPlayer是TableTennisPlayer的派生类)

    1 RatedPlayer::RatedPlayer(const string & fn, const string & ln, 
    2          bool ht, unsigned int ra)
    3  {
    4      firstname = fn;
    5      lastname = ln;
    6      hasTable = ht;
    7      rating = ra;
    8  }

     问题是,这么做是不行的。因为派生类的构造函数没有访问修改基类的权限。这个时候,前面说的成语初始化列表语法就派上用场了!下面直接看正确用法

    1 RatedPlayer::RatedPlayer(const string & fn, const string & ln, 
    2          bool ht, unsigned int ra) : TableTennisPlayer(fn, ln, ht)
    3  {
    4      rating = ra;
    5  }

     创建派生类对象时,程序首先创建基类对象!从概念来说,这意味着基类对象应该在程序进入派生类构造函数之前就被创建。在这儿,初始化成员列表语法就是使基类对象被优先创建!!!
    总结来讲,派生类构造函数的要点如下:
    1,首先创建基类对象。
    2,派生类构造函数应该通过成员初始化列表语法将基类信息传递给基类构造函数,从而优先创建基类对象。
    3,派生类构造函数应初始化派生类新增的数据成员。
    注意:派生类中非构造函数不能使用成员初始化列表语法,但是派生类方法可以调用公有的基类方法。

  • 再说成员初始化列表语法
    出虚基类外,类只能将值传递会相邻的基类,但后者可以用相同的机制将信息传递给相邻的基类,以此类推。这就像接力棒比赛
    将棒比喻为信息就行。
  • 派生类和基类之间的特殊关系
    1,派生类对象可以直接使用基类的方法,前提是方法不是私有的。若是私有的,可以通过间接使用,即将基类的私有方法镶嵌再派生类的方法中。
    2,基类的引用(指针)可以在不进行显式类型转换的情况下,引用(指向)派生类对象。(这一点十分重要,乃派生之精华)
    对于第二点:c++要求引用(指针)类型与赋给的类型匹配,但这对继承来说,是个例外,要注意的是:派生类的引用(指针)不可指向基类,即不可逆。
    当一个方法的形参类型是基类对象的引用(或指针)时,它会自动识别实参的类型,进而选择哪种对象。实参的类型有两种:基类对象和派生类对象。但要注意的是:基类指针或引用只能调用基类方法,不能调用派生类方法。这点在引入虚方法是就会改善,所以在学习派生类时要注意!!因为在这里容易混淆。

     

原文地址:https://www.cnblogs.com/busui/p/5800447.html