2010-06-10 17 views
12

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?

+2

Czy właśnie to lub deklaracja zajęć? – Nikko

+8

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. –

+4

@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;'. –

Odpowiedz

16

Oczywistą odpowiedzią jest to, że przecieka się oryginalny obiekt klasy bazowej.

+0

to była moja odpowiedź ... właściwie ... ale napomknął mi o innym problemie, który mogłem wymyślić. – Vijay

+0

Nie ma innego problemu. – Blindy

+0

Jedna rzecz może być taka, że ​​wyprowadzone w rzeczywistości muszą pochodzić z bazy. – ckv

0

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.

1

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ć.

0

Czy baseclass ma wirtualny destruktor? Jeśli nie, to może być również złe (oprócz oczywistego wycieku).

7

Poza oczywistym pamięci wyciek to zależy od definicji baseclass i derived niektóre problemy mogą być:

  1. derived nie jest publicznie pochodzącego z baseclass (jeśli tak, to jest straszne pytanie zadać w sposób wywiad)
  2. baseclass nie posiada destruktor wirtualny (w takim przypadku jest to niebezpieczne delete bptr;)
1

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?

0

Jedyny problem występuje, jeśli destruktor klasy nie jest zdefiniowany jako wirtualny. W tym scenariuszu spowoduje to wyciek pamięci

0

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.

5

Gdybym był tobą chciałbym odwrócić i zapytać parę ankietera pytań:

  1. Czy jesteś pewien, że to jest tylko fragment kodu dostępny iw tym przypadku moja odpowiedź jest wykształconym przypuszczenie, nic więcej.
  2. Czy istnieje jakiś rodzaj schematu mgmt pamięci dla klasy bazowej i wyprowadzony? W takim przypadku musimy przyjrzeć się operatorowi nowym definicjom, których nie podano.
  3. Jeśli nie ma pamięci o parametrze pmmt, to czy bazujące na baseclass lub pochodne typy wskaźników inteligentnych mają wartość odniesienia? Brak wycieków również w tych przypadkach.
  4. Jeśli nie ma inteligentnych typów, to oczywiście wygląda na wyciek pamięci.

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

+0

+1, Czasami pytania mogą być również odpowiedziami .. :) – liaK

2

jaki jest problem?

Jeśli odpowiedź („wyciek pamięci”) nie jest akceptowane, problemem jest też kwestia czy wywiad;)

0

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.