Question

Y at-il quelque chose dans la norme C ++ qui me empêche de surcharger la fonction d'une super-classe?

A partir de cette paire de classes:

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
};

Je peux appeler B::foo() facilement:

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

Mais si je tente d'appeler A::foo() ...

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

... Je reçois une erreur de compilation:

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)

Juste pour vous assurer que je ne manque quelque chose, je l'ai changé le nom de la fonction de B afin qu'il n'y ait pas de surcharge:

class B : public A {
    int x2;

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

Et maintenant je peux appeler A::foo() en utilisant le second exemple.

est cette norme? J'utilise g ++.

Était-ce utile?

La solution

Vous devez utiliser une déclaration à l'aide dans la définition de la classe B:

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

Sans la déclaration à l'aide, les trouvailles du compilateur B::foo lors de la recherche de nom et ne efficacement les classes recherche pas de base pour d'autres entités du même nom, donc A::foo ne se trouve pas.

Autres conseils

Vous n'êtes pas primordial la mise en œuvre de A::foo(int), au lieu que vous aliasing A::foo et changer sa signature (int, int) au lieu de (int). Comme James McNellis mentionné la déclaration de using A::foo; rend la fonction de A disponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top