Compiler Warnung 8022 bei Vererbung
-
Hallo zusammen,
bin wieder mal etwas überrascht, womit mich der BCB6 und CG2007 wieder konfrontieren. Liege ich hier falsch, oder ist es tatsächlich ein Compiler Bug?
#include <vector> #include <iostream> using namespace std; struct A {}; struct B {}; struct C {}; struct Interface { virtual ~Interface() {} // virtuelle Interface Methoden virtual void func( struct A& op ) = 0; virtual void func( struct B& op ) = 0; virtual void func( struct C& op ) = 0; }; // Default Implementation des Interface struct Default : Interface { virtual ~Default() {} void func( struct A& op ) { cout << "Default::func A" << endl; } void func( struct B& op ) { cout << "Default::func B" << endl; } void func( struct C& op ) { cout << "Default::func C" << endl; } }; // Spezialbehandlung für Datentyp A struct Special : Default { // alle func Methode der Basisklasse (Default) in scope bringen using Default::func; void func( struct A& op ) { cout << "Special::func A" << endl; } }; #pragma argsused int main(int argc, char* argv[]) { A theA; B theB; C theC; Default d; Special s; d.func( theA ); d.func( theB ); d.func( theC ); s.func( theA ); s.func( theB ); s.func( theC ); return 0; }
Der Compiler gibt mir zwei Warnungen W8022 aus, die eigentlich nicht auftauchen dürften.
(1) Special::func( A& ) verbirgt virtuelle Funktion Default::func( B& )
(2) Special::func( B& ) verbirgt virtuelle Funktion Default::func( C& )Die Programmausgabe ist genau das, was ich erwartet habe, er scheints schon richtig zu übersetzen und zu linken:
Default::func A Default::func B Default::func C Special::func A Default::func B Default::func C
Möchte die Warnungen gerne loswerden, hat da jemand ne Idee?
-
DocShoe schrieb:
bin wieder mal etwas überrascht, womit mich der BCB6 und CG2007 wieder konfrontieren. Liege ich hier falsch, oder ist es tatsächlich ein Compiler Bug?
Sieht aus, als sei es ein Bug. using-Statements in Klassen sind in BCC zuweilen etwas lückenhaft (siehe auch hier, Punkt 6 :D); in deinem Fall scheinen die Auswirkungen aber auf eine falsch gesetzte Warnung limitiert zu sein.
Einen QC-Report darüber habe ich nicht gefunden; vielleicht willst du einen verfassen?
-
Ich vergaß:
DocShoe schrieb:
Möchte die Warnungen gerne loswerden, hat da jemand ne Idee?
// Spezialbehandlung für Datentyp A #pragma option push -w-8022 struct Special : Default { // alle func Methode der Basisklasse (Default) in scope bringen using Default::func; void func( struct A& op ) { cout << "Special::func A" << endl; } }; #pragma option pop
-
Du bist doch hier in C++. Das struct-Keyword z.B. in
virtual void func( struct A& op ) = 0;
ist ueberfluessig. Zwar ist einmal virtual immer virtual bei Memberfunktionen, trotzdem sollte man es in jeder Ableitung mit hinschreiben. Btw. zwar kann man struct nutzen, aber class ist einfach besser hier.