Funkcje wirtualne, wątpliwości

0
  1. W programie mamy klasę odtwarzacz i pochodną od niej klasę odtwarzacz_mp3. Mamy też klasę utwor_muzyczny i pochodną od niej klasę piosenka_rockowa. Dziedziczenia są publiczne. W klasie odtwarzacz jest funkcja wirtualna:
utwor* wyswietl_wykonawcow()

Napisz możliwe deklaracje tej funkcji w klasie odtwarzacz_mp3 ? Czy mogą one tam wystąpić równocześnie ?

Moje pomysły:

utwor* wyswietl_wykonawcow();
piosenka* wyswietl_wykonawcow();

I teraz jeszcze jedna wątpliwość: czy mogą one tam(czyli w klasie odtwarzacz_mp3) wystąpić równocześnie ?

  1. Mamy klasę podstawową bilet, a w niej funkcję wirtualną która jest publiczna. W klasie pochodnej bilet_ulgowy funkcja ta zdeklarowana jest jako private. Jak zareaguje kompilator widząc, że w tekście programu, w funkcji main uruchamiamy tę funkcję drukuj na rzecz:
    a) obiektu klasy bilet, pokazywanego wskaźnikiem typu bilet*
    b) obiektu klasy bilet_ulgowy pokazywanego wskaźnikiem typu bilet*
    c) obiektu klasy bilet pokazywanego wskaźnikiem typu bilet_ulgowy*
    d) obiektu klasy bilet_ulgowy pokazywanego wskaźnikiem typu bilet_ulgowy*

Moje pomysły:
Generalnie dostęp jest taki, jaki ma ta wersja funkcji wirtualnej w klasie, z której jest wskaźnik więc:
a) ok, dostęp publiczny, uruchomiona zostaje funkcja wirtualna z klasy bilet
b) ok, dostęp publiczny, uruchomiona zostaje funkcja wirtualna z klasy bilet_ulgowy ?
c) błąd ? czy ma to w ogóle sens !?
d) błąd, dostęp prywatny

Czy gdy klasa bilet deklaruje przyjaźni z klasą bilet_ulgowy coś się zmienia w tych odpowiedziach ?

0
  1. nie! Bo różnią się tylko wartością zwracaną.
    2.a nijak
    2.b nijak
    2.c nie można ustawić wskaźnika na taką wartość.
    2.d odstęp do prywatnego symbolu.
0

Co do c: nie jestem pewien, ale chyba rzutowaniem na siłę (albo przez void*) dałoby się tak ustawić wskaźnik, ale lepiej tego nie robić...

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