2010-07-08 5 views
12

In einer abgeleiteten Klasse Wenn ich einen Funktionsnamen aus einer Base-Klasse,
, neu definieren/überladen, sind diese überladenen Funktionen nicht zugänglich/sichtbar für abgeleitete Klasse.
Warum ist das ??Überladene Funktionen sind in der abgeleiteten Klasse verborgen

Wenn wir die oveloaded Funktion von der Basisklasse nicht dann in abgeleiteten Klasse überlasten alle überladenen Versionen dieser Funktion abgeleiteten Klasse
Objekte verfügbar sind, warum ist das ??
Was ist der Grund dafür? Wenn Sie dies im Compiler und Linker Ebene
erklären, die für mich hilfreicher sein wird. Ist es nicht möglich, diese Art von Scinario zu unterstützen?

Edited 
For examble: 

class B 
{ 

    public: 
    int f() {} 
    int f(string s) {} 
}; 

class D : public B 
{ 
    public: 
    int f(int) {} 
}; 

int main() 
{ 
    D d; 
    d.f(1); 
    //d.f(string); //hidden for D 
} 

Now object 'd' can't access f() and f(string).
+2

Konnten Sie einen Beispielcode posten, Ihre Beschreibung ist überhaupt nicht klar. –

+1

mögliches Duplikat von [Warum versteckt eine überschriebene Funktion in der abgeleiteten Klasse andere Überladungen der Basisklasse?] (Http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the- derived-class-hide-other-overloads-of-the) – sbi

+0

@sbi Es tut mir leid, eine doppelte Frage zu stellen. Eigentlich habe ich eine Zeitlang versucht, ähnliche Fragen zu stellen, aber ich habe keine gefunden. Mein Suchmuster war falsch, so dass Sie die bestehende Frage nicht gefunden haben. – esh

Antwort

12

TTBOMK dies keinen wirklichen technischen Grund hat, es ist nur, dass Stroustrup, wenn die Sprache zu schaffen, dies als die bessere Verzug. (. Dabei ist es ähnlich wie bei der Regel, dass rvalues ​​implizit nicht an nicht-const Referenzen binden)

Sie können um es leicht arbeiten explizit Versionen Basisklasse in der abgeleiteten Klasse werden zu bringen Anwendungsbereich:

class base { 
public: 
    void f(int); 
    void g(int); 
}; 

class derived : public base { 
public: 
    using base::f; 
    void f(float); 
    void g(float); // hides base::g 
}; 

oder durch die expliziten Aufruf:

derived d; 
d.base::g(42); // explicitly call base class version 
+3

Diese Antwort auf eine andere, verwandte Frage liefert die Begründung - http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-edived-class-hide-other-over-loads-of- die/1629074 # 1629074 –

+1

Ich bin sehr glücklich, ein Mitglied dieser Gruppe zu sein. Die Mitglieder hier sind fantastisch. Ich bin so amüsiert, die Antworten innerhalb kürzester Zeit zu sehen. – esh

+0

@jon: Eigentlich macht dies diese Frage zu einem Duplikat. Ich habe dafür gestimmt, diesen zu löschen. – sbi

6

die Funktionen stehen zur Verfügung, Sie müssen nur sie explizit nennen:

struct A { 
    void f(){} 
}; 

struct B : public A { 
    void f() {} 
}; 

int main() { 
    B b; 
    b.f();  // call derived function 
    b.A::f(); // call base function 
} 
Verwandte Themen