本文共 1761 字,大约阅读时间需要 5 分钟。
#include#include using namespace std;class Base { public: int a; virtual void g() { cout << "Base::g" << endl; } virtual void h() { cout << "Base::h" << endl; } virtual void f() { cout << "Base::f" << endl; }};class Derive : public Base { public: int a; void print() { cout << "print" << endl; } virtual void f1() { cout << "Derive::f1" << endl; } virtual void f() { cout << "Derive::f" << endl; } virtual void f(char a) { cout << "Derive::f char a" << endl; } virtual void g() { cout << "Derive::g" << endl; } virtual void h() { cout << "Derive::h" << endl; }};int main(int argc, char *argv[]) { // typedef void(*pFun) (void); using pFun = void (*)(void); { Base b; cout << "虚函数表地址:" << (long *)(&b) << endl; cout << "虚函数表 — 第一个函数地址:" << (long *)*(long *)(&b) << endl; // Invoke the first virtual function,3种写法等价。。 pFun p1 = reinterpret_cast (*(long *)(((long *)(&b))[0])); auto p2 = (pFun) ((long *) * (long *)(&b))[1]; pFun p3 = (pFun) * ((long *) * (long *)(&b) + 2); p1(); p2(); p3(); } { Derive d; // 打印方法1 long **table = (long **)&d; for (int i = 0; i < 7; ++i) { auto pf = (pFun)table[0][i]; pf(); } /* 打印方法2 for (int i = 0; i < 7; ++i) { auto pf = (pFun)(long)((long *) * (long *)(&d))[i]; pf(); } */ } { // 虽然在Derive虚函数表中有 f1(),但是无法通过父类指针访问没有覆盖的函数 //Base1 *b1 = new Derive(); //b1->f1(); //编译出错 } return 0;}
转载地址:http://xecii.baihongyu.com/