虚函数的内存布局以及局限,请参照下面网址的介绍,很详细很精彩
https://blog.csdn.net/lixungogogo/article/details/51138493
C++在基类中声明一个带关键之Virtual的函数,这个函数叫虚函数;它可以在该基类的派生类中被重新定义并被赋予另外一种处理功能。通过指向指向派生类的基类指针或引用调用虚函数,编译器可以根据指向对象的类型在运行时决定调用的目标函数。这就实现了多态。
#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; }
在每一个含有虚函数的类对象中,增加了一个成员,就是都含有一个VPTR,指向虚函数表。
派生类也会继承基类的虚函数,如果宅派生类中改写虚函数,虚函数表就会受到影响;表中元素所指向的地址不是基类的地址,而是派生类的函数地址。
当执行语句pBase->fun1()时,由于PBase指向的是派生类对象,于是就调用的Deriver::fun1()。
2、多重继承的情况
#include<iostream> class base1 { public: virtual void vn() {} private: int i; ); class base2 { public: virtual void vf2(){} private: int j; ); class derived:public base 1,public base2 { public: virtual void vf3(){} private: int k; ); void main() { derived d; base1 p1; base2 p2; p1=&d; p2 =&d; p1->vf1(); p2->vf2(); }
如果一个类具有多个包含虚函数的父类,编译器会为它创建多个VIrtual table,每个virtual table中各个虚函数的顺序与相应的父类一样。