C++复习3 ----类的继承与派生
为什么要继承 如果软件编写的工程规模很大,重用已经测试过的类代码要比重新编写新代码节省开发时间。 基类与派生类 从已经定义的类产生新类的过程称为派生。在派生过程中,已定义的类称为基类,或称为父类;所产生的新类称为派生类,也称为子类。
单继承与多继承 从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。 声明派生类的格式: class 派生类名:[派生方式1],基类名1,[派生方式2],基类名2 [,...,派生方式n,基类名n] { //派生类新增的成员 };
继承下的访问控制 public继承----基类中的public和protected成员在派生类中仍然是public和protected private继承----基类中的public和protected成员在派生类中转化为private成员 protected继承----基类中的public和protected成员在派生类中转化为protected成员
派生类对象的初始化和撤销 由于基类的构造函数和析构函数不能被继承,所以,派生类需要自己的构造函数和析构函数。 单继承下的派生类构造函数的定义: 派生类构造函数名(参数表1):基类构造函数名(参数表2),子对象名(参数表3) { 派生类的构造函数体 } 注意:参数表2和参数表3中的参数必须是参数表1中的参数。
虚基类 在多继承中,如果派生类的两个或多个基类有共同的祖先基类,当派生类访问继承下来的公共成员时,可能因同名成员问题而出现二义性,通过虚基类,就可以避免这种二义性。 虚基类的声明是在派生类的声明过程中进行的,其形式为: class <派生类名>:virtual<继承方式><基类名>
继承的使用原则 在什么情况下使用继承,什么情况下使用组合,是面向对象程序设计的重要机制。
什么情况下使用组合 Class Car { 当一个类是由其它类的对象组合而成,且具有部分与整体关系,就可以使用组合。 Body body; Wheel wheel[4] Door left,right; Engine engine; Public: Run() { cout<<“This Car is runing.” <<endl;} } 当一个类是由其它类的对象组合而成,且具有部分与整体关系,就可以使用组合。 组合也是构建新类的重要手段,主要通过包含一个已经存在的类对象构建新类。 组合是将一些相对简单的对象组合成为复杂的对象。
什么情况下使用继承 在继承层次结构图中,居于顶层的类更具“一般性”,是其子类共同特性的抽象,反之,沿着继承树的分支向下延伸,下层的类变的更加“具体化”。 使用继承来创建类要考虑: 新类是否需要使用已知类的“全部”成员。 是否能将已知类的共有成员提取。 使用组合是否可以代替,若能则使用组合。
运行结果: Person.print 说明派生类可以使用基类中的成员函数 void main() class Person { public: void print() { cout<<"Person.print"<<endl;} }; class Student:public Person //Student继承Person void show() {cout<<"Student. show "<<endl; } void fun(Person &p) //参数是基类指针 { p.print(); } void main() { Person person; //类Person实例化成对象person Student student; //类Student实例化成对象student fun(student); //参数是对象student fun(person); //参数是对象person } 运行结果: Person.print 说明派生类可以使用基类中的成员函数
多态性 不同类型的对象接受了相同的消息,往往表现出不同的行为。类中相同的成员函数名对应不同的实现。 C++中,类的多态性主要有两种表现: 1.编译时的多态性(静态联编) 2.运行时的多态性(动态联编)
class Student { private: char Name[10]; public: void Learn() { cout<<"Student is Learning."<<endl; } }; class GraduateStudent:public Student //GraduateStudent继承Student Private: int Grade; void Learn() //派生类里有与基类同名的函数 {cout<<"GraduateStudent is Learning."<<endl;} 编译时的多态性 void main() { Student S; //基类Student实例化为对象S S.Learn(); //运行基类的方法Learn() GraduateStudent GS; //派生类GraduateStudent实例化 为GS GS.Learn(); //运行派生类的方法Learn() } 运行结果: Student is Learning. GraduateStudent is Learning.