第六章多态性与虚函数.ppt
文本预览下载声明
C++面向对象程序设计 5.7 基类与派生类的转换 子类型:有一个特定的类型S,当且仅当它至少提供了类型T的行为,则称类型S是类型T的子类型。 子类型关系是不可逆的。 公有继承方式下可以实现子类型。 5.7 基类与派生类的转换 赋值兼容:不同类型数据之间的自动转换和赋值。 基类与派生类对象之间有赋值兼容关系,如果类B是类A的子类型,则: 可将类B的对象赋值给类A的对象; 可将类B对象的地址赋值给指向类A对象的指针; 可将类B对象赋值给类A对象的引用。 5.7 基类与派生类的转换 (1)派生类对象可以向基类对象赋值 可用子类(公用派生类)对象对其基类对象赋值,赋值时舍弃派生类自己的成员 子类型关系是单向的、不可逆的 不能用基类对象对其子类对象赋值 同一基类的不同派生类对象之间也不能赋值 A a1; B b1; a1=b1; //B是A的公用派生类 5.7 基类与派生类的转换 (2)派生类对象可以代替基类对象向基类对象的引用赋值或初始化 A a1; B b1; A r=a1; r=b1; //赋值 //B是A的公用派生类 5.7 基类与派生类的转换 (3)如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类型对象 void fun(A r) {coutr.numendl;} fun(b1); //b1为B的对象,B是A的公用派生类 //输出对象b1的基类数据成员num的值 fun(a1); 5.7 基类与派生类的转换 (4)派生类对象的地址可以赋值给指向基类对象的指针变量 通过指向基类对象的指针,只能访问派生类中的基类成员,而不能访问派生类增加的成员 5.7 基类与派生类的转换 #include iostream #include string using namespace std; class Student {public: Student(int n,string nam ,float s) {num=n; name=nam; score=s; } void display() {coutendlnum:numendl; coutname:nameendl; coutscore:scoreendl; } private: int num; string name; float score; }; 5.7 基类与派生类的转换 5.8 继承与组合 类的组合:在一个类中以另外一个类的对象作为数据成员。 类的组合和继承一样,是软件重用的重要方式。 继承是“是”的关系,组合是“有”的关系; 继承是纵向的,组合是横向的。 5.8 继承与组合 class Teacher {public: . . . private: int num; string name; char sex; }; class BirthDate {public: . . . private: int year; int month; int day; }; 6.1 多态性的概念 多态性是面向对象程序设计的一个重要特征。 面向对象方法中:多态性是指当不同的对象收到相同的消息时,产生不同的动作。 C++程序设计中,多态性是指具有不同功能的函数可以用一个函数名,这样就可以用一个函数名调用不同内容的函数。 6.1 多态性的概念 从系统实现的角度看,分为静态多态性和动态多态性两类。 静态多态性(编译时的多态性): 在程序编译时,系统就决定调用哪个函数 表现形式为函数重载和运算符重载,通过函数重载实现 动态多态性(运行时的多态性): 程序运行过程中动态地确定操作所指向的对象 通过虚函数实现 6.3 虚函数 6.3.1 虚函数的作用 虚函数的作用:允许在派生类中重新定义与基类同名的函数,并可通过基类指针或引用来访问基类和派生类中的同名函数。 6.3.1 虚函数的作用 #include iostream//例6.2-1 #include string using namespace std; class Student {public: Student(int,string,float) ){num=n;name=nam;score=s;} void display() {coutnum:num\nname:“name\nscore:score \n\n;} protected: int num; string name; float score; }; class Graduate:public Student {public: Graduate(int,string,float,
显示全部