考虑以下结构体的层级:
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
编译这个程序(或者使用带有-Woverloaded-virtual
选项的g++
编译器)会给我一个警告:
编译结果为:
使用clang
编译这个程序(或者使用带有-Woverloaded-virtual
选项的g++
编译器)会给我一个警告:
'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;
};
使用I2::doit
和void doit(int) override = 0
之间有什么区别?幼稚的想法是,我原本认为前者足以告诉编译器我知道有两个版本的doit
。