2011-01-04 4 views
9

Gibt es etwas im C++ - Standard, das mich daran hindert, die Superklassenfunktion zu überlasten?Die Superklassenfunktion überladen

Beginnend mit diesem Paar Klassen:

class A {   // super class 
    int x; 

public: 
    void foo (int y) {x = y;} // original definition 
}; 

class B : public A { // derived class 
    int x2; 

public: 
    void foo (int y, int z) {x2 = y + z;} // overloaded 
}; 

ich B::foo() leicht anrufen:

B b; 
    b.foo (1, 2); // [1] 

Aber wenn ich versuche, A::foo() zu nennen ...

B b; 
    b.foo (12); // [2] 

.. Ich erhalte einen Compilerfehler:

test.cpp: In function 'void bar()': 
test.cpp:18: error: no matching function for call to 'B::foo(int)' 
test.cpp:12: note: candidates are: void B::foo(int, int) 

Nur um sicherzustellen, dass ich nicht etwas fehlte, ich den Namen B ‚s-Funktion geändert, so dass es keine Überlastung:

class B : public A { 
    int x2; 

public: 
    void stuff (int y, int z) {x2 = y + z;} // unique name 
}; 

Und jetzt kann ich A::foo() das zweite Beispiel mit Aufruf .

Ist dieser Standard? Ich benutze g ++.

Antwort

17

Sie müssen eine using-Deklaration innerhalb der Definition der Klasse verwenden B:

class B : public A { 
public: 
    using A::foo;   // allow A::foo to be found 
    void foo(int, int); 
    // etc. 
}; 

Ohne die Verwendung Erklärung findet der Compiler B::foo bei der Namenssuche und effektiv nicht mit dem gleichen Basisklassen für andere Einheiten durchsucht, Name, also A::foo wird nicht gefunden.

+1

, um die ursprüngliche Elementfunktion "auszublenden". –

+6

+1 - beachten Sie, dass dies in Scott Meyers 'Effektives C++ Item 33 (ausführlicher) behandelt wird: Vermeiden Sie es, vererbte Namen zu verstecken. –

0

Sie überschreiben nicht die A::foo(int) Implementierung, stattdessen aliasieren Sie A::foo und ändern ihre Signatur in (int, int) anstelle von (int). Wie James McNellis erwähnte, stellt die using A::foo; Deklaration die Funktion von A zur Verfügung.

+0

Der OP sagte nicht "übersteuern", er sagte überladen, und Überlastung ist was er tut. Überschreiben gilt für virtuelle Funktionen. –

+0

Was er tun wollte, war zu überladen. Was er stattdessen tat, war etwas, das dem Übersteuern ähnlich war, aber mit dem zusätzlichen Bonus des Aliasings der ursprünglichen Methode. Wie von James McNellis angemerkt, behebt die using-Anweisung das Problem und ermöglicht eine Überladung. –