нужно предупреждение о переопределении функции с параметром const - PullRequest
2 голосов
/ 02 февраля 2012

Как заставить 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 Ответ

4 голосов
/ 02 февраля 2012

Это должно быть -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.
...