1. 编译器的警告可能给出很重要的信息,例如:
class B{ public: virtual void f() const; ... }; class D:public B{ public: virtual void f(); ... };
由于B中的f是const成员函数,而D中的f是非const,因此D::f是对B::f的override而非重新声明,编译器通常会给出"warning: D:f() hides virtual B::f()"的警告,这个警告其实包含两层意思:
1). D并没有重新声明virtual void f() const,因而它继承了B的virtual void f() const实现.
2). 由于D声明了virtual void f(),它是对virtual void f() const的重写,由于名称遮掩,将不能通过D类型对象来调用virtual void f() const.
因此,会出现以下情况(见注释):
B b; D d; B* pb=&b; pb->f(); //调用的是B::f() pb=&d; pb->f(); //调用的仍然是B::f() !
2. 不同编译器有不同警告标准,因而不能依赖编译器来指出错误.