在基类的成员函数中如果有使用virtual关键字修饰的函数,实例化时就会产生一张对应这个类的对象的虚函数表,而这个函数本来应该是函数入口的,而现在变成了虚函数表的入口地址。然后通过虚函数表内找到函数的地址。
比如有这样两个类
class Base {public: virtual int fun() { return 0; }};class BaseSon:public Base {};其中:Base这个基类的fun函数是虚函数,实例化后,在这里存在的函数指针地址会被存到这个对象对应的一个虚函数表中,而这里的地址被换成了虚函数表地址。
Baseson继承的Base的fun函数,但是也是存在一个虚函数表(这张表和上面那张不是同一张),同样里面有Base的fun函数的函数地址(入口地址)。而且重点是,这个地址在这两张表中的相对位置相同,也就是偏移量相同。
class Base {public: virtual int fun() { return 0; }};class BaseSon:public Base {public: virtual int fun(){ return 1; }};在这种情况中,这里Base类和上面一致。但是BaseSon类的虚函数表内的那个地址被换成了BaseSon自己的那个return1的fun函数的入口地址。所以,可以通过使用基类的指针来访问派生类的fun函数,这样就可以实现动态多态,同一个命令对不同对象使用时,实现不同的功能。
新闻热点
疑难解答
图片精选