classBase { public: virtualvoidfun() { std::cout << "i am base func1" << std::endl; }; virtualvoidfunc2() { std::cout << "i am base func2" << std::endl; } };
long *p1, *p2, *p3, *p4, *p5, *p6; p1 = (long*)*(long*)&b; p2 = (long*)*(long*)&d; p3 = (long*)*(long*)*(long*)&b; p4 = (long*)*(long*)*(long*)&d; p5 = (long*)*((long*)*(long*)&b + 1); p6 = (long*)*((long*)*(long*)&d + 1); std::cout << "b object addrs:" << (long*)&b << std::endl; std::cout << "d object addrs:" << (long*)&d << std::endl; std::cout << "b vptr addrs:" << p1 << std::endl; std::cout << "d vptr addrs:" << p2 << std::endl; std::cout << "b func1 addrs:" << p3 << std::endl; std::cout << "d func1 addrs:" << p4 << std::endl; std::cout << "b func2 addrs:" << p5 << std::endl; std::cout << "d func2 addrs:" << p6 << std::endl; if (p1 == p2) { std::cout << "Derive & Base use the same vtable " << std::endl; } else { std::cout << "Derive & Base use different vtable " << std::endl; } if (p3 == p4) { std::cout << "b & d use the same func1 " << std::endl; } else { std::cout << "b & d use different func1" << std::endl; } if (p5 == p6) { std::cout << "b & d use the same func2 " << std::endl; } else { std::cout << "b & d use different func2" << std::endl; } }
运行结果:
b object addrs:0x7ffc33792f08
d object addrs:0x7ffc33792f10
b vptr addrs:0x557438cf8d48
d vptr addrs:0x557438cf8d28
b func1 addrs:0x557438cf6978
d func1 addrs:0x557438cf6978
b func2 addrs:0x557438cf69b4
d func2 addrs:0x557438cf69f0
Derive & Base use different vtable
b & d use the same func1
b & d use different func2