1、多态的实现机制
C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。
2、实例
- #include<iostream>
- using namespace std;
-
- class Base
- {
- public:
- virtual void fun1 () {cout<<" printf base fun1!" <<endl;}
- virtual void fun2 () {cout<<" printf base fun2!" <<endl;}
- private:
- int m_data1;
- } ;
-
- class Derive: public Base
- {
- public:
- void fun1 () {cout<<" printf derive fun1!" <<endl;}
- void fun3 () {cout<<" printf derive fun3" <<endl;}
- private:
- int m_data2;
- } ;
-
- int main ()
- {
- Base *pBase=new Derive;
- Derive a;
- pBase->fun1 () ;
- pBase->fun2 () ;
- a.fun3 () ;
- return 0;
- }
3、底层机制
在每一个含有虚函数的类对象中,都含有一个VPTR,指向虚函数表。
![](https://img-blog.csdn.net/20141216212513053?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmNob25nXzIxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
派生类也会继承基类的虚函数,如果宅派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。
![](https://img-blog.csdn.net/20141216212829551?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmNob25nXzIxOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。
4、多重继承
- #include<iostream_h>
- class base1
- {
- public:
- virtual void vn(){}
- private:
- inti;
- );
- class base2
- {
- public:
- virtual void vf2(){}
- private:
- intj;
- );
- class derived:public base 1,public base2
- {
- public:
- virtual void vf3(){}
- private:
- int k:
- );
- void main()
- {
- derivedd:
- base1 pl;
- base2 p2;
- pl=&d;p2 &d:
- pl->vfl();
- p2->vf2();
- }
如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样。