
第12章多态性12.1多态性概述12.2派生类对象替换基类对象12.3虚函数12.5运算符重载12.4抽象类程序设计举例
0 第12章 多态性 12.1 多态性概述 12.2 派生类对象替换基类对象 12.3 虚函数 12.5 运算符重载 12.4 抽象类 程序设计举例

12.1多态性概述多态性:对象在接收相同消息时,所做出的响应不同。利用多态性技术,可以调用同名函数,实现完全不同的功能分类(1)编译时的多态性:同一类的不同对象或同一对象在不同环境下调用同名成员函数,所完成的功能不同通过函数的重载和运算符的重载来实现的。(2)运行时的多态性:属于同一基类的不同派生类对象,在形式上调用基类的同一成员函数,而实际上调用的是各自派生类的同名成员函数。它是通过类继承关系和虚函数来实现的
1 12.1 多态性概述 多态性:对象在接收相同消息时,所做出的响应不同。 利用多态性技术,可以调用同名函数,实现完全不同的功能 分类: (1)编译时的多态性:同一类的不同对象或同一对象在不同 环境下调用同名成员函数,所完成的功能不同 通过函数的重载和运算符的重载来实现的。 (2)运行时的多态性: 属于同一基类的不同派生类对象,在形式上调用基类的同 一成员函数,而实际上调用的是各自派生类的同名成员函 数。 它是通过类继承关系和虚函数来实现的

编译时多态性函数重载(兔子逃生)class兔子public:void逃生(老鹰a)(“兔子鹰:: 1void逃生(狼b)“动如脱兔1:
2 编译时多态性—— 函数重载(兔子逃生) class 兔子 { public: . void 逃生(老鹰a){“兔子蹬鹰”;} void 逃生(狼 b){“动如脱兔”;} . };

运行时的多态性Ⅱ宠物classPet( public:void speak()( cout<<"zzz"; };1;classCat:public Pet(public:void speak()( cout<<"miao!miao!";;class Dog:public Petpublic:宁void speak()cout<<"wang!wang!";)3;
3 运行时的多态性 class Pet //宠物 { public: void speak() { cout<< "zzz"; }; }; class Cat : public Pet { public: void speak() { cout<< "miao!miao!"; } }; class Dog : public Pet { public: void speak() { cout<< "wang!wang!"; } };

int main()IIp为宠物类指针{ Pet *p ;Catcat1;定义猫类对象Dogdog1;定义狗类对象int n;cin>>n;根据用户输入将猫或狗对象地址赋给p指针if(n==1)p=&cat1;elsep=&dog1;p->speak() ;return 0;
4 int main() { Pet *p; //p为宠物类指针 Cat cat1; //定义猫类对象 Dog dog1; //定义狗类对象 int n; cin>>n; //根据用户输入将猫或狗对象地址赋给p指针 if(n==1) p = &cat1; else p = &dog1; p->speak(); return 0; }

12.2派生类对象替换基类对象原则凡是基类对象出现的场合都可以用公有派生类对象取代对象替换常用的形式:(1)派生类对象给基类对象赋值(2)派生类对象可以初始化基类对象的引用(3)可以令基类对象的指针指向派生类对象,即将派生类对象的地址传递给基类指针注:派生类对象替换基类对象后,只能当作基类对象使用
5 12.2 派生类对象替换基类对象 原则 凡是基类对象出现的场合都可以用公有派生类对象取代 , 对象替换常用的形式 : (1)派生类对象给基类对象赋值 (2)派生类对象可以初始化基类对象的引用 (3)可以令基类对象的指针指向派生类对象,即将派生 类对象的地址传递给基类指针 注:派生类对象替换基类对象后,只能当作基类对象使用

例12-1派生类对象替换基类对象宠物classPet( public:void speak()( cout<<" How does a pet speak ?"; };1;classCat:public Pet(public:void speak()(cout<<"miao!miao!";);class Dog:public Petpublic:宁void speak()cout<<"wang!wang!";)3;
6 例12-1 派生类对象替换基类对象 class Pet //宠物 { public: void speak() { cout<< " How does a pet speak ? "; }; }; class Cat : public Pet { public: void speak() { cout<< "miao!miao!"; } }; class Dog : public Pet { public: void speak() { cout<< "wang!wang!"; } };

int main(){Pet pet,*p1;/基类对象指针p1,基类对象petDog dog1;Cat cat1;Ⅱ用Dog类对象给Pet类对象赋值pet = dog1;pet.speak();p1 = &cat1;Ⅱ用Cat类对象地址给基类指针赋值p1->speak();
7 int main() { Pet pet, *p1; //基类对象指针p1, 基类对象pet Dog dog1; Cat cat1; pet = dog1; //用Dog类对象给Pet类对象赋值 pet.speak(); p1 = &cat1; //用Cat类对象地址给基类指针赋值 p1->speak();

p1=&dog1;I用Dog类对象地址给基类指针赋值p1->speak();以Cat类对象初始化Pet类引用Pet &pet2=cat1:pet2 .speak();return 0;speak?HowdoespetHowpet speak?doesaapet speak?Howdoesaspeak?Howdoespeta0
8 p1 = &dog1; //用Dog类对象地址给基类指针赋值 p1->speak(); Pet &pet2 = cat1; //以Cat类对象初始化Pet类引用 pet2 .speak(); return 0; }

12.3虚函数虚函数的定义定义:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数语法:函数返回类型virtual函数名(参数表)函数体人Y用途实现多态性,通过指向派生类的基类指针或基类对象的引用,访问派生类中同名覆盖成员函数
9 12.3 虚函数 一、虚函数的定义 定义: 在某基类中声明为 virtual 并在一个或多个派生类中 被重新定义的成员函数 语法: virtual 函数返回类型 函数名(参数表) { 函数体 } 用途: 实现多态性,通过指向派生类的基类指针或基类对 象的引用,访问派生类中同名覆盖成员函数