如何让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通知我重新定义具有不同签名的成员函数?
答案 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.