一般生成对象的时候,前四个字节就是虚表的地址。虚表在编译时期就建立了
class Base1 {
public:
virtual void f() { cout << "Base::f" << endl; }
};
class Base2 {
public:
void f() { cout << "Base::f" << endl; }
};
class Base {
public:
virtual void f() { cout << "Base::f" << endl; }
virtual void g() { cout << "Base::g" << endl; }
virtual void h() { cout << "Base::h" << endl; }
};
Base1 b1;
Base2 b2;
Base b;
sizeof(b1) 是4
sizeof(b2) ,sizeof(Base2) 是1,函数不占用空间
sizeof(b) 也是4
typedef void(*Fun)(void);
Base b;
Fun pFun = NULL;
cout << "虚函数表地址:" << (int*)(&b) << endl;
cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
// Invoke the first virtual function
pFun = (Fun)*((int*)*(int*)(&b));
(Fun)*((int*)*(int*)(&b)+0); // Base::f()
(Fun)*((int*)*(int*)(&b)+1); // Base::g()
(Fun)*((int*)*(int*)(&b)+2); // Base::h()
c++中不能申明为虚函数的函数有:
1 构造函数 2 静态函数 3 内联函数 4 友元函数 5 普通函数(非类的成员函数)