2012-03-25 13 views
0

eine konstante Methode der Basisklasse von der abgeleiteten Klasse

class Base{ 
//... 
    public: 
    int get()const{ // const 
    // Do something. 
    } 
    int get(int x){ 
    // Do Someting. 
    } 

    //... 

}; 
class Derived:public Base{ 
//.... 
    public: 
    int get(){ // not const (not the same signature as the one is the base class) 
    //Dosomething 
    } 
     //... 

}; 

zwingende weiß ich, dass() in abgeleiteten Klasse bekommt verstecken get() und (int x) Methoden innerhalb Basisklasse erhalten. Also meine Frage ist:
1) ist dies Consedred Überladung oder Übersteuern?
2) macht das machen von get() const in der abgeleiteten Klasse wird etwas ändern (versteckt oder nicht versteckt Basisklasse Methoden).

Zitat aus einem C++ Buch:

„Es ist ein häufiger Fehler eine Basisklasse Methode zu verstecken, wenn Sie beabsichtigen, sie außer Kraft zu setzen, indem zu vergessen das Schlüsselwort const schließen const Teil der Signatur ist, und. so dass es aus ändert die Signatur und verbirgt damit die Methode nicht außer Kraft gesetzt. "

+0

Overloading: http://en.wikipedia.org/wiki/Function_overloading, Zwingende: http://en.wikipedia.org/wiki/Method_overriding – alfa

+0

in Basis zweiten get verpasst den Rückgabetyp –

Antwort

6

Es ist weder überladen noch überschreiben. Vielmehr ist es versteckt.

Wenn die andere Funktion auch sichtbar waren, es würde eine Überlastung, die Sie mit using erreichen können:

class Derived : public Base 
{ 
public: 
    using Base::get; 
    int get(); 
}; 

Auch wenn Sie int get() const in der abgeleiteten Klasse deklariert, wäre es nur die Basis verstecken Funktion, da die Basisfunktion nicht virtual ist.

+0

1) Der einzige Fall des Überschreibens besteht also darin, die get-Funktion in der Abgeleiteten Klasse sichtbar zu machen?
2) würde mir das nicht einen Fehler geben, weil es multiple Definition ist? – AlexDan

+0

@AlexDan: Nein, der einzige Weg, um zu überschreiben ist, um 'zu machen * * virtual * und dann eine andere Funktion in' Derived' mit der gleichen Signatur zu deklarieren. –

+0

Was ist mit der Methode, die Sie bereits erwähnt haben, mit dem Schlüsselwort 'using'? Ist das übergangen? und kannst du mir erklären, was das Schlüsselwort 'using' in der Klasse Derived ist. und tut mir leid, all diese Frage. thnks – AlexDan

2
  1. Weder noch, es ist nur‚versteckt‘.

  2. Nein. Das Ausblenden erfolgt basierend auf dem Funktionsnamen, nicht auf der Funktionssignatur.

Ihr Angebot ist nur dann relevant, wenn Sie die Basisklassen-Funktionen virtual deklariert haben; Sie können eine Nicht-virtual-Funktion nicht überschreiben.

+0

ich in einem Buch gelesen diese : Zitat "Es ist ein häufiger Fehler, eine Basisklassenmethode zu verstecken, wenn Sie beabsichtigen, sie zu überschreiben, indem Sie vergessen, das Schlüsselwort const. Const ist Teil der Signatur und ändert es die Signatur und damit verbirgt die Methode, anstatt sie zu überschreiben. "Kannst du es mir erklären. danke – AlexDan

+0

@AlexDan: Siehe meine aktualisierte Antwort. –

2

Überladen ist eine Funktion mit dem gleichen Namen, aber mit einer anderen Signatur.

Das Überschreiben überschreibt eine bereits vorhandene Signatur.

Sie haben gerade "versteckt", was weder ist.

Eine schnelle Google-Suche zeigt dies: http://users.soe.ucsc.edu/~charlie/book/notes/chap7/sld012.htm die Sie hilfreich finden können.

+0

Das Überschreiben erfordert auch, dass die Basisfunktion virtuell ist. –

Verwandte Themen