类继承小记
-
类继承
-
派生类所具有特征:
- 派生类对象存储了基类的数据成员(继承了基类的实现)
- 派生类对象可以使用基类的方法(继承了基类的接口)
-
派生类需添加:
- 派生类需要自己的构造函数
- 派生类可以根据需要添加额外的数据成员和成员函数
-
已知有一个基类TableTennisPlayer class TableTennisPlayer { private: string firstname; string lastname; bool hasTable; public: TableTennisPlayer (const string & fn = "none", const string & ln = "none",bool ht = false); void Name() const; bool HasTable() const { return hasTable}; void ResetTable(bool v){hasTable = v}; }; 现在有一个子类RatedPlayer class RatedPlayer: public TableTennisPlayer { private: unsigned int rating; public: RatedPlayer (unsigned int r =0, const string & fn = "none", const string & ln = "none", bool ht = false); RatedPlayer(unsigned int r, const TableTennisPlayer & tp); unsigned int Rating() const {return rating;} void ResetRating (unsigned int r) {rating = r;} }; //派生类不能直接访问基类的私有成员,必须通过基类方法访问。具体来说,派生类构造函数必须使用基类构造函数.c++使用成员初始化列表语法来完成这种工作 RatedPlayer (unsigned int r, const string & fn, const string & ln, bool ht):TableTennisPlayer(fn,ln,ht) { rating = r; } 若去掉:TableTennisPlayer(fn,ln,ht)则将使用基类的默认构造函数,除非你要如此,否则应显示调用正确的基类构造函数
-
派生类构造函数要点:
- 首先创建基类对象
- 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
- 派生类构造函数应初始化派生类新增的数据成员
- 派生类对象过期时,程序将首先调用派生类析构函数,再调用基类析构函数
-
派生类对象可以使用基类的方法,条件是方法不是私有的
-
基类指针可以再不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象 然而,基类指针或引用只能用于调用基类方法
-
继承:
- 公有继承:最常用,是一种is-a关系,即派生类对象也是一个基类对象
- 保护继承
- 私有继承
-
实现多态公有继承:
- 在派生类中重新定义基类的方法
- 使用虚方法:如果要在派生类中重新定义基类的方法,通常应将基类方法声明为虚的。这样,程序将根据对象类型而不是引用或指针的类型来选择方法版本。 在函数声明之前加上virtual
-
为基类声明一个虚析构函数也是一种惯例,这是为了确保释放派生对象时,按正确的顺序调用析构函数。
-
关键字virtual只用于类声明的方法原型中,而没有用于方法定义中
-
虚方法的使用典例:假设想要创建一个数组来同时保存基类和子类对象,直接做是办不到的。但是可以创建指向基类对象的指针数组,由于采用的是公有继承,指针既可以指向基类对象,也可以指向子类对象
-
静态联编与动态联编:将源代码中的函数调用解释为执行特定的函数代码被称为函数名联编。在编译过程中进行联编被称为静态联编,在运行时选择正确的虚方法被称为动态联编
-