通过学习《Inside the C++ Object Model》发现了一些好玩的代码,记录在此吧,以方便搜集以后发现的好玩,或者归你的代码。
- 类对象能展现多态吗?
struct Base { int j; virtual void f() { std::cout << "Base::f()" << std::endl; } }; struct Derived : Base { void f() { std::cout<< "Derived::f()" << std::endl; } }; int main() { Base b; b.f(); // Base::f() invoked b.~Base(); new ( &b ) Derived; // 1 b.f(); // which f() invoked? }
你认为控制台会输出哪两句话呢?请仔细分析几分钟。
好吧,答案揭晓。严格意义上来说没有答案,因为C++ 标准没有定义。具体结果要依赖具体的编译器。但在大部分编译器下,上述代码会输出:
Base::f()
Base::f()
给这种结果一个合适的解释是:类对象不支持多态。也就是说,当你写完最后一行 b.f() 的时候,编译器在编译的时候,已经将其替换成了_Base_FV( &b )了。这个函数就是Base::f()经编译器修饰后的函数。所以b.f()的调用根本不会去查虚表什么的,所以输出上述两行结果。