Versteckt eine private überladene virtuelle Funktion?

9

Ich habe eine Klassenhierarchie, die ungefähr so ​​funktioniert:

%Vor%

Wenn ich versuche, mit clang (oder gcc, für diese Angelegenheit) zu kompilieren, gibt es mir die Warnung

%Vor%

Was ich verstehe, aber sollte es wirklich diese Warnung geben? Schließlich kann DB nicht einmal die verborgene Funktion sehen (die möglicherweise sogar durch Zufall benannt wird).

Wenn es nicht privat war, konnte ich

verwenden %Vor%

um klarzustellen, natürlich, aber die Funktion ist privat, DB weiß nicht einmal darüber, und sollte es sicherlich nicht entlarven.

Gibt es eine Möglichkeit, das zu beheben, ohne diese Warnung zu deaktivieren, d. h. dem Compiler mitzuteilen, dass alles so konzipiert ist, wie es beabsichtigt ist?

    
Sacchan 05.07.2017, 14:52
quelle

3 Antworten

3
  

Schließlich kann DB nicht einmal die verborgene Funktion sehen (die vielleicht sogar durch Zufall benannt wird).

Zugänglichkeit und Sichtbarkeit sind unterschiedliche Konzepte in C ++. DA::f() ist standardmäßig sichtbar in DB (und dann von DB::f() ausgeblendet), aber es ist nicht zugänglich, da es in DA privat ist und DB nicht a ist Freund von DA . Man könnte argumentieren, dass das Ausblenden einer Funktion, auf die nicht zugegriffen werden kann, harmlos ist, weil sie ohnehin nicht aufgerufen werden kann. Die Unterscheidung zwischen versteckt und unzugänglich kann jedoch erheblich sein, da sichtbare und nicht zugängliche Funktionen an der Überladungsauflösung beteiligt sind. Wenn db ein Objekt vom Typ DB ist, was macht dann db.f(0) ? Wenn DA::f() sichtbar, aber nicht zugreifbar ist, wird es als beste Übereinstimmung ausgewählt, und der Compiler gibt eine Diagnose aus, weil es nicht zugänglich ist und daher nicht aufgerufen werden kann. Wenn DA::f() jedoch ausgeblendet ist, wählt der Compiler stattdessen die Überladung aus, die einen Zeiger akzeptiert, und behandelt das Literal 0 als Nullzeiger.

    
Arne Vogel 05.07.2017, 16:44
quelle
0

Was ich (vorerst) getan habe, ist die Verwendung von Komposition statt privater Vererbung. Also sieht mein Code momentan wie

aus %Vor%

Ich bin nicht 100% zufrieden, da die d Mitglieder zusätzlichen syntaktischen Overhead verursachen, aber zumindest funktioniert es, ohne die öffentliche Schnittstelle zu ändern.

    
Sacchan 05.07.2017 16:05
quelle
0

Eine Möglichkeit, die Warnung zu beheben, besteht darin, den Code von DA::f in DB :

zu duplizieren %Vor%

Demo

aber ein lokales Pragma zum Entfernen der Warnung scheint geeigneter.

    
Jarod42 05.07.2017 17:47
quelle

Tags und Links