Jak wywołać funkcję nadrzędną z klasy pochodnej przy użyciu C ++? Na przykład mam klasę o nazwie parent
i klasę o nazwie child
pochodzącą od rodzica. W każdej klasie jest print
funkcja. W definicji funkcji drukowania dziecka chciałbym wywołać funkcję drukowania dla rodziców. Jak miałbym to zrobić?
c++
oop
inheritance
IaCoder
źródło
źródło
Odpowiedzi:
Zaryzykuję stwierdzenie oczywistości: wywołujesz funkcję, jeśli jest zdefiniowana w klasie bazowej, jest automatycznie dostępna w klasie pochodnej (chyba że jest
private
).Jeśli w klasie pochodnej istnieje funkcja o tej samej sygnaturze, można ją ujednoznacznić, dodając nazwę klasy podstawowej, a następnie dwa dwukropki
base_class::foo(...)
. Należy zauważyć, że w przeciwieństwie do Java i C #, C ++ nie ma słowa kluczowego dla „klasy podstawowej” (super
lubbase
), ponieważ C ++ obsługuje wielokrotne dziedziczenie, które może prowadzić do niejednoznaczności.Nawiasem mówiąc, nie można dwa razy wywodzić bezpośrednio z tej samej klasy, ponieważ nie będzie możliwości odniesienia się do jednej z klas podstawowych nad drugą.
źródło
template<class A, class B> class C: public A, public B {};
może dojść do dwóch typów, które są takie same z powodów zależnych od sposobu użycia kodu (co sprawia, że A i B są takie same), może być dwóch lub trzech warstwa abstrakcji od kogoś, kto nie jest świadomy tego, co zrobiłeś.using namespace std
.Biorąc pod uwagę nazwaną klasę nadrzędną
Parent
i nazwaną klasę podrzędnąChild
, możesz zrobić coś takiego:Zauważ, że
Parent
jest to rzeczywista nazwa klasy, a nie słowo kluczowe.źródło
foo()
tu analogicznaprint()
funkcja czy osobna funkcja? Czy masz na myśli wykorzystanieprivate
dziedziczenia do ukrycia szczegółów odziedziczonych z bazy i zapewnieniepublic
funkcji cieniowania rzeczy, które chcesz ujawnić?foo()
był analogiczny doprint()
. Wróćmy do używania,print()
ponieważ moim zdaniem miałoby to większy sens w tym kontekście. Powiedzmy, że ktoś stworzył klasę, która przeprowadziła pewien zestaw operacji na określonym typie danych, ujawniła niektóre akcesoria i miałaprint(obj&)
metodę. Potrzebuję nowej klasy, która działa,array-of-obj
ale wszystko inne jest takie samo. Kompozycja powoduje powstanie dużej ilości powielonego kodu. Dziedziczenie minimalizuje to podczasprint(array-of-obj&)
wywoływania w pętliprint(obj&)
, ale nie chce, aby klienci dzwonili,print(obj&)
ponieważ nie ma dla nich sensuJeśli twoja klasa podstawowa jest wywoływana
Base
, a twoja funkcja jest wywoływanaFooBar()
, możesz wywołać ją bezpośrednio za pomocąBase::FooBar()
źródło
W MSVC istnieje słowo kluczowe specyficzne dla Microsoft: __super
MSDN: Umożliwia jawne stwierdzenie, że wywołujesz implementację klasy podstawowej dla zastępowanej funkcji.
źródło
typdef
rodzica jak coś takiegosuper
.__super
; Wspomniałem o tym tutaj jako alternatywnej sugestii. Programiści powinni znać swojego kompilatora oraz zrozumieć zalety i wady jego możliwości.Jeśli modyfikator dostępu do funkcji członka klasy bazowej jest chroniony LUB publiczny, możesz wykonać funkcję wywołania klasy bazowej z klasy pochodnej. Można wywoływać nie-wirtualne i wirtualne funkcje klasy podstawowej z pochodnej funkcji składowej. Proszę odnieść się do programu.
Wynik:
źródło
virtual
!Wywołaj metodę nadrzędną za pomocą operatora rozstrzygania zakresu nadrzędnego.
źródło
Przykład odniesienia.
źródło