phimuemue
phimuemue

Reputation: 36071

Hiding overloaded virtual function

Consider the following hierarchy of structs:

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

Compiling this (using clang, or g++ with -Woverloaded-virtual) gives me a warning:

'Derived::doit' hides overloaded virtual function [-Woverloaded-virtual]

However, if I change I12 to the following, it compiles fine under clang, while g++ -Woverloaded-virtual still gives a warning:

struct I12 : I1, I2 {
    using I1::doit;
    void doit(int) override = 0;
};

Where is the difference between using I2::doit and void doit(int) override = 0? Naively, I would have thought that the former is sufficient to inform the compiler that I am aware that there are two versions of doit.

Upvotes: 17

Views: 9615

Answers (1)

Maxim Egorushkin
Maxim Egorushkin

Reputation: 136495

It complains that doit is hidden in Derived. A fix:

struct Derived : I12 {
    using I12::doit; // Bring all doit declarations from I12 into this scope.
    void doit(int) override {}
};

Upvotes: 9

Related Questions