例12-2虚函数实现多态性Ⅱ宠物classPet( public:virtual void speak()( cout<<" How does a pet speak?"; }1;classCat:publicPet( public:virtualvoid speak()(cout<<"miao!miao!";);class Dog:public Pet( public:virtualvoid speak((cout<<"wang!wang!";);10
10 例12-2 虚函数实现多态性 class Pet //宠物 { public: virtual void speak() { cout<< " How does a pet speak ? "; }; }; class Cat : public Pet { public: virtual void speak() { cout<< "miao!miao!"; } }; class Dog : public Pet { public: virtual 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();11
11 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;Howdoesapetspeak?miaotmiao!wang!wang!miao!miao!12
12 p1 = &dog1; //用Dog类对象地址给基类指针赋值 p1->speak(); Pet &pet2 = cat1; //以Cat类对象初始化Pet类引用 pet2 .speak(); return 0; }
虚函数的使用限制应通过指针或引用调用虚函数,而不要以对象名调用虚函数说明语句例:Pet obj, p1;/基类对象指针p1,基类对象objDog dog1;obj = dog1;Ⅱ用Dog类对象给Pet类对象赋值obj.speak();结果:调用的还是基类的speak()函数引用特点一引用一旦初始化后,就无法重新赋值。13
13 二、虚函数的使用限制 1、应通过指针或引用调用虚函数,而不要以对象名调用 虚函数说明语句 例: Pet obj, p1; //基类对象指针p1, 基类对象obj Dog dog1; obj = dog1; //用Dog类对象给Pet类对象赋值 obj. speak(); 结果:调用的还是基类的speak()函数 引用特点—引用一旦初始化后,就无法重新赋值
虚函数的使用限制2.在派生类中重定义的基类虚函数仍为虚函数,同时可以省略virtual关键字注:基类内的虚函数.-对外接口派生类内的虚函数具体的方法(功能)3.不能定义虚构造函数,可以定义虚析构函数14
14 二、虚函数的使用限制 2、在派生类中重定义的基类虚函数仍为虚函数,同时 可以省略virtual关键字 注:基类内的虚函数-对外接口 派生类内的虚函数-具体的方法(功能) 3、不能定义虚构造函数,可以定义虚析构函数