好玩,诡异,代码大全-阿里云开发者社区

开发者社区> 开发与运维> 正文

好玩,诡异,代码大全

简介: 通过学习《Inside the C++ Object Model》发现了一些好玩的代码,记录在此吧,以方便搜集以后发现的好玩,或者归你的代码。 类对象能展现多态吗? struct Base { int j; ...

通过学习《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()的调用根本不会去查虚表什么的,所以输出上述两行结果。


版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章