需要有关使用const参数覆盖函数的警告

时间:2012-02-02 14:12:27

标签: android c++ g++ const porting

如何让GCC通知我重新定义具有不同签名的成员函数?

我正在将一个大项目移植到Android。 由于M $ VC和GCC方言的不同,我为函数参数插入了许多const修饰符。 (即,当您致电func(MyClass(something))时,M $可以使用MyClass&,而GCC需要const MyClass&。)

问题在于,当您更改BaseClass::func()的签名时,您不会收到关于为DerivedClass::func()设置不同签名的警告。

这是一个小程序,显示正在发生的事情:

#include <stdio.h>
    class Value {
       int x;
       public:
       Value(int xx):x(xx){}
  };
    class Base {
       public:
       virtual void f(const Value&v) {printf("Base\n");}
  };
    class First: public Base {
       public:
       virtual void f(Value&v) {printf("First\n");}
  };
    class Second: public Base {
       public:
       virtual void f(Value&v) {printf("Second\n");}
  };

    int main() {
         Value v(1);
         First first;
         Second second;
         Base*any;
         any = &first;
         any->f(v);
         any->f(Value(2));
         first.f(v);
    //first.f(Value(3)); // error: no matching function for call to 
         First::f(Value)
}

当我编译并运行它时,我得到:

$ g++ -Wall -Wextra inher2.cpp 
    inher2.cpp:10:18: warning: unused parameter ‘v’
    inher2.cpp:15:18: warning: unused parameter ‘v’
    inher2.cpp:20:18: warning: unused parameter ‘v’
$ ./a.out 
    Base
    Base
    First
$

(gcc对未使用的参数是正确的,但它无关紧要。)

所以: 如何让GCC通知我重新定义具有不同签名的成员函数?

1 个答案:

答案 0 :(得分:4)

那应该是-Woverloaded-virtual。

  

-Woverloaded虚拟

 Warn when a derived class function declaration may be an error in
 defining a virtual function (C++ only).  In a derived class, the
 definitions of virtual functions must match the type signature of a
 virtual function declared in the base class.  With this option, the
 compiler warns when you define a function with the same name as a
 virtual function, but with a type signature that does not match any
 declarations from the base class.