#include <iostream> #include <windows.h> class TestVirtual { public: TestVirtual(int m = 5): _m(m) { } virtual int VirtualFunc() { std::cout << "TestVirtual::VirtualFunc is running" << std::endl; return _m; } private: int _m; }; int main() { TestVirtual oTv; TestVirtual *pTv = &oTv; oTv.VirtualFunc(); ZeroMemory(&oTv, sizeof(oTv)); oTv.VirtualFunc(); // 这里为什么能正确执行? (&oTv)->VirtualFunc(); // 这里为什么能正确执行? pTv->VirtualFunc(); // 这里为什么不能正确执行? return 0; } #include <iostream> #include <windows.h> class Base { public: virtual void VirtualFunc() { std::cout << "TestVirtual::VirtualFunc is running" << std::endl; } virtual void VirtualFunc2() { std::cout << "TestVirtual::VirtualFunc2 is running" << std::endl; } }; class TestVirtual: public Base { public: void Func() { std::cout << "TestVirtual::Func2 is running" << std::endl; } }; int main() { TestVirtual oTv; TestVirtual *pTv = &oTv; oTv.VirtualFunc(); oTv.Func(); oTv.VirtualFunc2(); ZeroMemory(&oTv, sizeof(oTv)); oTv.VirtualFunc(); // 这里为什么能正确执行? oTv.VirtualFunc2(); // 这里为什么能正确执行? oTv.Func(); (&oTv)->VirtualFunc(); // 这里为什么能正确执行? (&oTv)->VirtualFunc2(); // 这里为什么能正确执行? (&oTv)->Func(); pTv->Func(); pTv->VirtualFunc(); // 这里为什么不能正确执行? pTv->VirtualFunc2(); // 这里为什么不能正确执行? return 0; }