Proszę wyjaśnić mi na tym przykładzie:
class X
{
public:
virtual f(void);
f1(void);
}, x, *px;
Co oznacza
}, x, *px;
przy zamknięciu klasy?
Proszę wyjaśnić mi na tym przykładzie:
class X
{
public:
virtual f(void);
f1(void);
}, x, *px;
Co oznacza
}, x, *px;
przy zamknięciu klasy?
Deklaracja obiektów tej klasy.
x - obiekt klasy
px - wskaźnik na obiekt
Ten wskaźnik *px tyczy się obiektu x?
Nie, wskaźnik jest niezainicjalizowany.
Mam problem odnośnie tej klasy, takie zadanie:
class X
{
public:
virtual f(void);
f1(void);
}, x, *px;
class Y: public X
{
public:
virtual f(void);
f1(void);
}, y, *py;
Które z powyzszych zestawów przypisan jest poprawny, wyjasnic dlaczego:
a. x=y; py=px;
b. y=x; py=px;
c. x=y; px=py;
d. px=py; y=x;
Myślę że b jest poprawną odpowiedzią, bo jeśli mamy dwa obiekty A i B(które dziedziczy po A) to można przypisać B do A. To jest jedna z zasad programowania, dokładnie zasada podstawienia Liskov, poczytaj o tym na wiki
Pytanie jest tak naprawdę błędnie zadane.
Wg prowadzącego zapewne chodzi o odpowiedź (c), co łatwo można sprawdzić po prostu kompilując kod. Wytłumaczenie jest takie, że jeśli Y
dziedziczy po X
, to każdy obiekt typu Y
jest obiektem typu X
.
x = y;
Oczekujemy obiektu typu X
, a y
jest obiektem typu X
(patrz wyżej).
y = x; // błąd
Oczekujemy obiektu typu Y
, a x
nie jest obiektem typu Y
.
Natomiast w tym przypadku te zmienne są niezainicjalizowane, więc każde z tych przypisań będzie oznaczało undefined behaviour
, więc prawidłowa odpowiedź jest żaden z tych zestawów przypisań nie jest poprawny.
Poza tym taki zapis deklaracji obiektów jest pozostałością po C, rzadko się go widzi w C++ i tak naprawdę nie ma powodu żeby go używać.