首先来一张图,一目了然:
然后把相应的代码贴上来:
1 class A 2 { 3 int a; 4 5 public: 6 virtual void f(); 7 virtual void g(int); 8 virtual void h(double); 9 }; 10 11 class B : public A 12 { 13 public: 14 int b; 15 16 void g(int); //overrides A::g() 17 virtual void m(B*); 18 }; 19 20 class C : public B 21 { 22 public: 23 int c; 24 25 void h(double); //overrides A::h() 26 virtual void n(C*); 27 };
后记:(1)每个类的一开始都是一个虚函数指针,这个指针指向一个虚函数表,表中的每一项都是相应的虚函数的指针。
(2)类在继承的时候,一个子类的开始就是基类的部分,了解继承后子类的模型。
(3)vfptr这个指针有范围的,比如A类的vfptr只能看三个记录,B的vfptr能看四个记录,C的vfpr能看五个记录。这就是多态的时候,父类的指针 指向子类对象的时候,它看不到子类的数据成员和成员函数(包括子类中的虚函数)。
(4)一般的面向对象的语言多态基本都是这个原理,前面写了一篇博文,当时说的是基类和派生类的vfptr分开了,其实他们是在一起的,前面之所 以分开说,是为了叙说方便。