隐藏重载虚函数

Hiding overloaded virtual function

本文关键字:函数 重载 隐藏      更新时间:2023-10-16

考虑以下结构的层次结构:

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::doitvoid 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 {}
};