Frage

Gibt es etwas im C ++ - Standard, das mich daran hindert, die Funktion einer Superklasse zu überladen?

Beginnend mit diesem Klassenpaar:

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 kann anrufen B::foo() leicht:

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

Aber wenn ich versuche anzurufen A::foo() ...

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

... Ich bekomme einen Compiler -Fehler:

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 mir etwas nicht fehlte, habe ich den Namen von geändert BDie Funktion so, dass es keine Überlastung gibt:

class B : public A {
    int x2;

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

Und jetzt kann ich anrufen A::foo() Verwenden des zweiten Beispiels.

Ist das Standard? Ich benutze G ++.

War es hilfreich?

Lösung

Sie müssen eine Verwendung in 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 der Verwendung findet der Compiler B::foo Während der Namensuche und effektiv sucht keine Basisklassen für andere Entitäten mit demselben Namen, also A::foo wurde nicht gefunden.

Andere Tipps

Du bist nicht überschreibend A::foo(int)Implementierung, stattdessen sind Sie Aliasing A::foo und seine Signatur in (int, int) anstelle von (int) ändern. Wie James McNellis das erwähnte using A::foo; Die Deklaration macht die Funktion von einem verfügbaren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top