Vorbemerkungen
Ihr Code-Snippet nicht aus einem anderen Grund nicht kompiliert: Base
hat keinen Zugriff auf Time
‚s foo()
wie es ein privates Mitglied ist. So verursacht die foo1()
einen Fehler, bevor Sie die Mehrdeutigkeit gemeldet haben.
Wenn Sie Time
ändern ihr Mitglied geschützt zu machen, dann können Sie Ihre Fehler reproduzieren genau so, wie Sie beschreiben:
class Time{
protected:
void foo();
};
Was hier los?
Base
erbt privat Time
, so dass seine Mitglieder nicht von außen sichtbar sein sollen.
Aber was für die externe Welt wahr sein könnte, gilt nicht für abgeleitete Klassen. Die Namenssuche Regeln im Fall der Ableitung sagen, dass zuerst der Name in der Klassenhierarchie aufsah, dann ist Überlastung angelegt, als nur Steuerzugriff durchgeführt:
10.2/1 Member name lookup determines the meaning of a name (id-expression) in a class scope. Name lookup can result in an ambiguity, in which case the program is ill-formed. For an id-expression, name lookup begins in the class scope of this; for a qualified-id, name lookup begins in the scope of the nested-name-specifier. Name lookup takes place before access control.
10.2/8 If the name of an overloaded function is unambiguously found, overloading resolution also takes place before access control. Ambiguities can often be resolved by qualifying a name with its class name.
Wie Sie Mehrfachvererbung verwenden:
Time
:
:
Base Time
\ :
\ :
Child
So erben Sie zweimal eine foo()
, einmal über private Vererbung und onve über die Öffentlichkeit. Diese Mehrdeutigkeit macht den Namen foo
in foo2()
mehrdeutig gemäß dem Standard und bevor der Zugriff verifiziert wird, macht Ihren Code ungültig.
Beachten Sie, dass Kind 2 foo() sieht, aber ironischerweise kann keiner von ihnen verwenden: beide kommen über private geerbt. Selbst wenn Sie die Mehrdeutigkeit auflösen würden, erhalten Sie eine weitere Fehlermeldung zur Barrierefreiheit.
private versteckt es nicht. – Jarod42
Weil sowohl Base als auch Time eine Memberfunktion namens foo haben und der Compiler nicht weiß, welchen Sie aufrufen möchten. Da draußen ist irgendwo ein Betrüger. –
wird Namespace innerhalb Base verstecken es? –