例题6-2用虚函数实现多态性 #include <iostream.h> class Pet 1/基类 public: virtual void speak({cout<<"How does a pet speak ?"<<endl; }; class Cat public Pet /派生类 public: void speak(){cout<<"miao!miao!"<<endl; }; class Dog public Pet /派生类 public: void speak() cout<<"wang!wang!"<<endl; }; 2025/4/6
#include <iostream.h> class Pet //基类 {public: virtual void speak() { cout<<"How does a pet speak ?"<<endl; } }; 例题6-2 用虚函数实现多态性 class Cat : public Pet //派生类 {public: void speak() { cout<<"miao!miao!"<<endl; } }; class Dog : public Pet //派生类 { public: void speak() { cout<<"wang!wang!"<<endl; } }; 2025/4/6 11
例题6-2用虚函数实现多态性 void main( { Pet *ptr,obj;//A 输出如下: Dog dogl; Cat cat1; ptr->speak(;//B How does a pet speak? ptr=&cat1; ptr->speak0;/∥C miao!miao! ptr=&dogl; ptr->speakO;//D wang! 利用虚函数机制实现了“一个接口,多种 方法”的完备意义的多态性。 2025/4/6
void main() { Pet *ptr,obj;//A Dog dog1; Cat cat1; 输出如下: 例题6-2 用虚函数实现多态性 ptr->speak(); //B ptr= &cat1; ptr->speak(); // C ptr = &dog1; ptr->speak(); //D } How does a pet speak? miao!miao! wang! 利用虚函数机制实现了“一个接口,多种 方法”的完备意义的多态性。 2025/4/6 12
二、虚函数的实现原理(虚函数表) (1)定义了虚函数的基类增加了一个存放虚函数调用 地址的函数指针表Virtual table,该表的首地址由基类 的内部指针vptr指示。 (2)派生类会从基类中继承虚函数指针表Virtual table 和指针vptr。 2025/4/6
二、虚函数的实现原理(虚函数表) (1)定义了虚函数的基类增加了一个存放虚函数调用 地址的函数指针表Virtual table,该表的首地址由基类 的内部指针vptr指示。 (2)派生类会从基类中继承虚函数指针表Virtual table 和指针vptr。 2025/4/6 13
虚函数的实现原理(虚函数表) (3)如果虚函数在派生类中被重新定义,则 Virtual table中的调用地址将被重新定义的虚函数的 调用地址替换,否则仍然使用直接基类虚函数的调用 地址。 (4)调用虚函数时的多态性是由基类指针动态指 向派生层次中某个类的对象,通过该对象的内部指 针vptr所指示的Virtual tabler中的相应调用地址实现 的。 2025/4/6
(3) 如果虚函数在派生类中被重新定义,则 Virtual table中的调用地址将被重新定义的虚函数的 调用地址替换,否则仍然使用直接基类虚函数的调用 地址。 二、虚函数的实现原理(虚函数表) (4)调用虚函数时的多态性是由基类指针动态指 向派生层次中某个类的对象,通过该对象的内部指 针vptr所指示的Virtual table中的相应调用地址实现 的。 2025/4/6 14