隐藏重载虚函数
Hiding overloaded virtual function
考虑以下结构的层次结构:
struct I1 {
virtual void doit() = 0;
};
struct I2 {
virtual void doit(int) = 0;
};
struct I12 : I1, I2 {
using I1::doit;
using I2::doit;
};
struct Derived : I12 {
void doit(int) override {}
};
编译这个(使用clang
,或g++
与-Woverloaded-virtual
)给我一个警告:
'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual]
但是,如果我将I12
更改为以下内容,它在clang
下编译良好,而g++ -Woverloaded-virtual
仍然给出警告:
struct I12 : I1, I2 {
using I1::doit;
void doit(int) override = 0;
};
using I2::doit
和void doit(int) override = 0
的区别在哪里?我天真地认为前者足以告知编译器我知道doit
有两个版本。
它抱怨doit
隐藏在Derived
中。一个解决办法:
struct Derived : I12 {
using I12::doit; // Bring all doit declarations from I12 into this scope.
void doit(int) override {}
};
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载