如何消除C++虚函数隐藏警告?告知编译器调用重载函数
解决基类虚函数被派生类重载函数隐藏的警告问题
首先明确:C++里派生类定义同名但参数列表不同的函数时,会隐藏基类所有同名函数(不管是不是虚函数),这就是编译器弹出-Woverloaded-virtual警告的原因——它默认你可能是不小心掩盖了基类的虚函数。
如果你确认自己是故意重载而非误操作,有两种规范的处理方式:
1. 用using声明引入基类函数(推荐)
通过using Base::test;把基类的test()引入派生类的作用域,这样派生类就同时拥有test()和test(int)两个重载版本,编译器会明确知道你是有意重载,不会再触发警告:
#include <iostream> struct Base { Base() { } virtual void test(); }; struct Derived : Base { Derived() { } using Base::test; // 引入基类的无参test函数 void test(int asd) { } }; int main() { Derived derived; derived.test(2); // 调用派生类的test(int) // 此时也可以调用derived.test(); 调用基类的test() }
2. 针对性忽略警告(不推荐,仅当确实不需要基类函数时使用)
如果你明确不需要基类的test(),只是想让编译器停止警告,可以用编译器特定的指令屏蔽该警告。以GCC/Clang为例:
#include <iostream> struct Base { Base() { } virtual void test(); }; #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverloaded-virtual" struct Derived : Base { Derived() { } void test(int asd) { } }; #pragma GCC diagnostic pop int main() { Derived derived; derived.test(2); }
push和pop的作用是仅屏蔽这段代码的警告,不会影响项目中其他代码的警告检测。
内容的提问来源于stack exchange,提问作者markzzz
相关产品推荐
相关产品推荐

