隐藏重载的虚函数
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 {}
};
考虑以下结构层次结构:
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 {}
};