2013-02-17 9 views
9

Ich muss verstehen, warum C++ nicht zu Grandparent überladenen Funktionen in Child zugreifen, wenn eine der überladenen Funktion in Parent deklariert ist. Betrachten Sie das folgende Beispiel:Grandparent überladene Funktion in Kind

class grandparent{ 
public: 
    void foo(); 
    void foo(int); 
    void test(); 
}; 

class parent : public grandparent{ 
public: 
    void foo(); 
}; 

class child : public parent{ 
public: 
    child(){ 
     //foo(1); //not accessible 
     test(); //accessible 
    } 
}; 

Hier sind zwei Funktionen foo() und foo (int) sind überladene Funktionen in Großeltern. Aber foo (int) ist nicht zugänglich, da foo() in Parent deklariert wird (egal, ob es öffentlich oder privat oder geschützt ist). Allerdings ist test() zugänglich, was gemäß OOP richtig ist.

Ich muss den Grund für dieses Verhalten kennen.

Antwort

10

Der Grund ist Methode versteckt.

Wenn Sie eine Methode mit demselben Namen in einer abgeleiteten Klasse deklarieren, werden Basisklassenmethoden mit diesem Namen ausgeblendet. Die vollständige Signatur spielt keine Rolle (d. H. CV-Qualifikationsmerkmale oder Argumentliste).

Wenn Sie explizit den Anruf zulassen möchten, können Sie

using grandparent::foo; 

innen parent verwenden.

+0

Gibt es einen Grund, warum dieses Verhalten eine gute Sache ist? (dh ** warum ** wie in aus welchem ​​Grund, im Gegensatz zu * warum * wie in dem, was es verursacht) –

+1

@SanjayManohar die einzige Verwendung, die ich sehe, wäre Fehler zu verhindern - dh zu denken, Sie rufen eine Methode von Eltern und eine Methode von Großeltern aufrufen, weil Sie einen Parameter falsch eingegeben haben. Und Sie können es mit der 'using'-Direktive umgehen. –

+0

@SanjayManohar siehe http://stackoverflow.com/questions/4837399/c-rationale-behind-hiding-rule –

1

Man stelle sich vor, dass eine Bibliothek dieser Klasse hat:

struct Base { 
}; 

In Ihrem Code Sie diese Klasse als Basisklasse verwenden:

struct Derived : Base { 
    void f(int); 
}; 

und jetzt schreiben Sie:

Derived d; 
d.f('a'); 

Und jetzt erhalten Sie die glänzende neue Version 2.0 dieser Bibliothek, und die Basisklasse hat sich ein wenig geändert:

Wenn Überladung hier angewendet wird, würde Ihr Code brechen.

Verwandte Themen