Powiedzmy istnieje klasa bazowa wskaźnika, który jest skierowany do obiektu klasy bazowej:C++ pytanie wywiad z udziałem klasy wskaźniki
baseclass *bptr;
bptr= new baseclass;
teraz jeśli mogę zrobić
bptr= new derived;
jaki jest problem?
Powiedzmy istnieje klasa bazowa wskaźnika, który jest skierowany do obiektu klasy bazowej:C++ pytanie wywiad z udziałem klasy wskaźniki
baseclass *bptr;
bptr= new baseclass;
teraz jeśli mogę zrobić
bptr= new derived;
jaki jest problem?
Oczywistą odpowiedzią jest to, że przecieka się oryginalny obiekt klasy bazowej.
Zmieniasz położenie wskaźnika bez zwalniania pamięci przydzielonej dla poprzedniego obiektu. Może to spowodować wyciek pamięci, na wypadek, gdyby żadne inne ciało nie zapisało wartości bptr
przed ponownym przypisaniem.
W pierwszym wierszu zadeklarowano wskaźnik. W drugim wierszu nadajesz mu odniesienie w pamięci. w linii 3, dajesz IT kolejne odniesienie w pamięci.
pierwsze odniesienie do wskaźnika wyciekło ... nigdy nie można go odzyskać.
Czy baseclass
ma wirtualny destruktor? Jeśli nie, to może być również złe (oprócz oczywistego wycieku).
Poza oczywistym pamięci wyciek to zależy od definicji baseclass
i derived
niektóre problemy mogą być:
derived
nie jest publicznie pochodzącego z baseclass
(jeśli tak, to jest straszne pytanie zadać w sposób wywiad)baseclass
nie posiada destruktor wirtualny (w takim przypadku jest to niebezpieczne delete bptr;
)Czy on próbuje dostać się do Circle Ellipse problem? Jeśli wyprowadzona jest specjalizacja klasy podstawowej, niektóre publiczne metody na klasie bazowej mogą nie mieć już znaczenia, np. jeśli Circle pochodzi z Elipsy, a Ellipse ma metodę o nazwie stretch(), która rozciąga elipsę w jednej osi, co zrobisz, gdy metoda zostanie wywołana w instancji Circle?
Jedyny problem występuje, jeśli destruktor klasy nie jest zdefiniowany jako wirtualny. W tym scenariuszu spowoduje to wyciek pamięci
Istnieje nie ma problemu z składnią, ale tracisz adres instancji "baseclass" przez przypisanie nowej wartości do zmiennej "bptr". Powoduje to przeciek pamięci, ponieważ adres pierwszej klasy utraconej.
Gdybym był tobą chciałbym odwrócić i zapytać parę ankietera pytań:
Proszę, mając wirtualne destruktory itp., Tylko jeśli posiadasz definicje klas. Być może prowadzący wywiad potajemnie szuka typów jasnowidzących.
Arpan
+1, Czasami pytania mogą być również odpowiedziami .. :) – liaK
jaki jest problem?
Jeśli odpowiedź („wyciek pamięci”) nie jest akceptowane, problemem jest też kwestia czy wywiad;)
chciałbym odpowiedzieć na to pytanie wywiad tak:
Z ograniczonego fragmentu kodu wynika, że wyciek pamięci wystąpi, gdy przypiszemy wskaźnik do instancji tej klasy pochodnej, ponieważ nie mamy żadnych innych wskaźników uzyskujących dostęp do obiektu podstawowego. Jednak nie da się już powiedzieć o fragmencie kodu bez zobaczenia definicji obu klas i zobaczenia związku między tymi dwiema klasami.
Czy właśnie to lub deklaracja zajęć? – Nikko
Mam zamiar zastosować niespójny schemat nazewnictwa. Jeśli logicznie posiadasz 'baseclass', będziesz miał również' derivclass'. Również odstępy są różnego rodzaju błędem. * Każdy * wie, że gwiazdka należy do typu, a nie do zmiennej. –
@Dennis Logicznie rzecz biorąc gwiazdka należy do typu, ale syntaktycznie należy do zmiennej. Spróbuj tego i powiedz mi, czy ptr2 jest wskaźnikiem czy nie: 'MyClass * ptr1, ptr2;'. –