Deklaracja klasy w C++

0

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?

1

Deklaracja obiektów tej klasy.

2

x - obiekt klasy
px - wskaźnik na obiekt

0

Ten wskaźnik *px tyczy się obiektu x?

2

Nie, wskaźnik jest niezainicjalizowany.

0

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;

0

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

2

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1