Funktion mit demselben Namen, aber unterschiedlicher Signatur in der abgeleiteten Klasse
Ich habe eine Funktion mit dem gleichen Namen, aber mit unterschiedlicher Signatur in einer Basis-und abgeleitete Klassen. Wenn ich versuche, mit den base Klasse s-Funktion in einer anderen Klasse erbt die abgeleitete, erhalte ich eine Fehlermeldung. Siehe den folgenden code:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
Erhalte ich die folgende Fehlermeldung vom gcc-compiler:
In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)
Wenn ich entfernen int foo(int i){};
aus der Klasse B
oder wenn ich es umbenennen von foo1
funktioniert alles einwandfrei.
Was ist das problem mit diesem?
Kommentar zu dem Problem
Technisch ein Duplikat von diese Frage aber dafür hat man einen besseren Titel und Antworten.
InformationsquelleAutor der Frage Igor Oks | 2009-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktionen in abgeleiteten Klassen überschreiben nicht die Funktionen in der Basis-Klassen, aber die haben die gleichen Namen verstecken weitere Funktionen mit dem gleichen Namen in der Basisklasse.
Ist es im Allgemeinen als schlechte Praxis, haben Funktionen, die in abgeleiteten Klassen, die den gleichen Namen haben wie Funktionen in der bass Klasse, die sind nicht gedacht, um der Basisklasse überschreiben Funktionen als das, was Sie sehen, ist in der Regel nicht wünschenswert Verhalten. Es ist in der Regel vorzuziehen, um unterschiedliche Funktionen mit unterschiedlichen Namen.
Wenn Sie benötigen, rufen Sie die Basis-Funktion, die Sie benötigen, um den Umfang der Anruf mithilfe
A::foo(s)
. Beachten Sie, dass dies auch deaktivieren Sie alle virtuelle Funktion Mechanismus fürA::foo(string)
zur gleichen Zeit.InformationsquelleAutor der Antwort CB Bailey
Ist es, weil die Suche Stoppt, wenn es feststellt, dass ein name in einer Ihrer Basen. Es wird nicht über in anderen Basen. Die Funktion in B Schatten die Funktion in A. Sie müssen re-deklarieren Sie die Funktion Einer in den Rahmen B, so dass beide Funktionen sind sichtbar von innen B und C:
Edit: Die eigentliche Beschreibung der Standard gibt, ist die (aus 10.2/2):
Er hat Folgendes zu sagen: in einen anderen Ort (nur oben):
([...] von mir). Beachten Sie, dass bedeutet, dass selbst wenn Sie Ihre foo in B ist privat, den foo in Einen noch nicht gefunden (da Zugriffssteuerung geschieht später).
InformationsquelleAutor der Antwort Johannes Schaub - litb