2013-01-08 9 views
27

Jest to prawdopodobnie noob pytanie, przepraszam za to. Ostatnio miałem do czynienia z dziwnym problemem, kiedy próbowałem poradzić sobie z rzeczami wysokiego poziomu w C++, przeciążaniem funkcji i dziedziczeniem.C++ problem z przeciążeniem funkcji w odziedziczonej klasie

Pokażę prosty przykład, aby zademonstrować problem;

Istnieją dwie klasy, classA i classB, jak poniżej;

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
}; 

Zgodnie z tym co wiem classB powinien posiadać dwa func(..) funkcje przeciążone z powodu różnych argumentów.

Ale przy próbie tego w głównej metody;

int main(){ 
    int a; 
    char b[20]; 
    classB objB; 
    objB.func(a); //this one is fine 
    objB.func(b); //here's the problem! 
    return 0; 
} 

Daje błędów jak metoda void func(char[]){}; która w super klasie classA nie jest widoczny Int klasy pochodnej, classB.

Jak mogę to przezwyciężyć? czy tak nie działa przeciążanie w C++? Jestem nowy w C++, ale w Javie, wiem, że mogę użyć czegoś takiego.

Chociaż już znalazłem this thread, który pyta o podobne problemy, myślę, że te dwa przypadki są różne.

Odpowiedz

40

Wszystko czego potrzebujesz to using:

class classB:public classA{ 
    public: 
     using classA::func; 
     void func(int){}; 
}; 

Nie szukaj klasę bazową dla func ponieważ już znaleźć jeden w klasie pochodnej. Instrukcja using przenosi inne przeciążenie do tego samego zakresu, dzięki czemu może brać udział w przeciążeniu.

9

Jest dobrze wyjaśnione na przykład w odpowiedzi na to pytanie jest:

Why should I use the "using" keyword to access my base class method?

w skrócie, kompilator przestanie Poszukiwanie metod z klas nadrzędnych, gdy znajdzie pasujący nazwę metody w bieżącej klasy, nawet gdy ta metoda nie jest zgodna. Sądzę, że dzięki temu niektóre automatyczne konwersje typów mogą działać bardziej logicznie, bez konieczności nadpisywania tylu metod klasy nadrzędnej.

+1

Dzięki za odpowiedź + link. Zastanawiam się, czy ludzie C++ celowo to ukrywają. czy są jakieś plusy? wydaje mi się, że to psuje ideę dziedziczenia, prawda? – Anubis

+0

@Anubis, to tylko kwestia zasad dotyczących rozdzielczości przeciążenia i celu generowania deklaracji "using". – chris

3

Jeśli zastąpisz jeden wariant funkcji w klasie pochodnej, musisz zastąpić wszystkie warianty. Możesz użyć tego, co JLledo zasugerował lub napisać wariant funkcji w klasie pochodnej, która po prostu wywołuje funkcję klasy bazowej o tej samej sygnaturze.

class classA{ 
    public: 
     void func(char[]){};  
}; 

class classB:public classA{ 
    public: 
     void func(int){}; 
     void func(char[]){}; 
}; 

void classB:func(char[] ch) 
{ 
    classA::func(ch); 
} 
-4

Musisz zdać argument typu int w

objB.func(b); //here's the problem! 

BCS został przeładowany int argumentu

+0

Możesz spróbować i podać bardziej szczegółową odpowiedź. – easwee

Powiązane problemy