1 基础和示例1
每个包含了虚函数的类都包含一个虚表,类中只要有虚函数,就会有一个虚表来维护。
虚表是属于类的,而不是属于某个具体的对象;同一个类的所有对象都使用同一个虚表。
虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针;
普通的函数即非虚函数,其调用并不需要经过虚表,虚表的元素并不包括普通函数的函数指针;
虚函数表的地址总是存在于对象实例中最前面的位置,其后依次是对象实例的成员;
我们可以使用对象实例的地址来得到虚函数表的地址,进而获得具体的虚函数的地址,然后进行调用;
#include <iostream>
#include "afxwin.h"using namespace std;class Base
{
public:Base(int mem1 = 101, int mem2 = 202) : m_mem1(mem1), m_mem2(mem2) { ; }virtual void vfunc1() { std::cout << "In vfunc1(), 1111" << std::endl; }virtual void vfunc2() { std::cout << "In vfunc2(), 2222" << std::endl; }private:int m_mem1;int m_mem2;
};int _tmain(int argc, _TCHAR* argv[])
{Base b;// 对象b的地址int *bAddress = (int *)&b;// 对象b的vtptr的值int *vtptr = (