2016-10-04 6 views
9

die folgende Hierarchie von Strukturen vor:Hiding überladene virtuelle Funktion

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

des Kompilieren (mit clang oder g++ mit -Woverloaded-virtual) gibt mir eine Warnung:

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

Allerdings, wenn ich I12 ändern zu den folgenden, kompiliert es unter clang, während g++ -Woverloaded-virtual noch eine Warnung gibt:

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

Wo ist der Unterschied zwischen using I2::doit und void doit(int) override = 0? Naiverweise hätte ich gedacht, dass ersteres ausreicht, um den Compiler zu informieren, dass ich weiß, dass es zwei Versionen von doit gibt.

+0

Welchen Compiler verwenden Sie? Ich kann keine Warnung in gcc oder MSVS bekommen, aber ich klänge. – NathanOliver

+0

Ja, du versteckst es. Was ist deine Frage? Wie man die ausführliche Warnung beseitigt? – songyuanyao

+0

@NathanOliver Ich benutze clang, aber die Verwendung von g ++ mit Warnungen zeigt ein anderes Verhalten. – phimuemue

Antwort

1

Es klagt, dass doit in Derived versteckt ist. A fix:

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

Danke für deinen Vorschlag, aber in meinem konkreten Fall habe ich 'Derived1',' Derived2', ... und möglicherweise sogar 'doit1',' doit2' ..., also möchte ich nicht wirklich alle wiederholen 'using'-deklaratios überall, aber möglichst nur an einem zentralen Ort. – phimuemue

+0

@phimuemue Bei einem solchen Design kann es einfacher sein, die Warnung zu deaktivieren. '-Wno-overloaded-virtual'. Andernfalls müssen Sie 'using' überall streuen, denn so funktioniert das Verbergen von Namen in C++. –

Verwandte Themen