码迷,mamicode.com
首页 > 编程语言 > 详细

Effective C++条款53

时间:2015-06-18 09:35:40      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

不要轻忽编译器的警告

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

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;
}

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

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

Effective C++条款53

标签:

原文地址:http://blog.csdn.net/u011058765/article/details/46543899

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!