好玩,诡异,代码大全

21 篇文章 0 订阅
13 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值