Effective C++条款53

不要轻忽编译器的警告

编译器的警告对于有些程序员来说并不在意。他们认为警告并不威胁程序或者对程序来说没有什么太大的副作用。然而,这种想法在编程的时候可能会付出很大的代价。
如下例子:

class B{
    public:
        virtual void f() const;
    };
    class D: public B{
    public:
        virtual void f();
    };

该段代码的程序员想让class D继承class B的f()函数,但是D中却没有声明为const。编译器不会报错,可能会给如下警告,如下

warning: D::f() hides virtual B::f()

你或许会想,这正是我们想做的事。但是编译器在试图告诉你B::f并没有在D中重新声明,而是被遮掩了。如果忽略这个警告,比如导致错误行为。此时多态性会受到威胁。
如下代码:

#include<iostream>
using namespace std;


class B{
public:
    virtual void f() const{ cout << "class B" << endl; };
};
class D : public B{
public:
    virtual void f(){ cout << "class D" << endl; };
};

int main()
{
    B *b;
    B b1;
    D d1;
    b = &b1;
    b->f();//调用class B的f
    d1.f();//调用class D的f
    b = &d1;
    b->f();//调用class B的f
    return 0;
}

从编译器的警告中获得经验,学会了解警告信息和它们看起来的意义并不十分相同。在最高警告级别下没有任何警告的程序是最理想的,但是对警告欧了深刻理解,可以选择忽略某些警告信息。但是一定记住在忽略这个警告之前,一定要了解它的真实意图。

警告信息和编译器相关,不同的编译器有不同的警告标准。例如上面代码中的函数遮掩在另一个编译器编译,可能没有任何警告。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值