好玩,诡异,代码大全

通过学习《Inside the C++ Object Model》发现了一些好玩的代码,记录在此吧,以方便搜集以后发现的好玩,或者归你的代码。

  1. 类对象能展现多态吗?
        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()的调用根本不会去查虚表什么的,所以输出上述两行结果。


你可能感兴趣的:(好玩,诡异,代码大全)