Wpis z mikrobloga

Cześć, #programowanie i #cpp - mam wątpliwość. Jest sobie klasa Central. I jest sobie też klasa IRCentral taka, że:

class IRCentral : public Central
Tworzę ją sobie tak:

Central * central = new IRCentral();
Jeżeli Central ma funkcję

virtual bool test() { return false; }
a IRCentral ma funkcję

bool test() { return true; }
to czy mogę mieć pewność, że zwyczajne

central->test();
zawsze zwróci true? Nie musze robić tak? O tak:

IRCentral * ircentral = (IRCentral*) central;
żeby mieć pewność? To się tam samo dzieje? Nie będę miał z tym jakichś innych problemów? Tak to ma działać? :P
  • 16
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@elektrunek: Funkcje wirtualne są wykonywane dla aktualnego dynamicznego typu obiektu.

Uƶywanie nagiego new/delete i ogółem zarządzanie zasobami jest niebezpieczne i prędzej czy później prowadzi do niepoprawnej ich kontroli, szczególnie w przypadku rzadszych ścieƶek wyjścia z zakresu (np. rzucenie wyjątku, return/break w nieprzewidzianym miejscu). C++ ma RAII, trzeba z tego korzystać.
  • Odpowiedz
Funkcje wirtualne są wykonywane dla aktualnego dynamicznego typu obiektu.


@KrzaQ2: nie mądrz się tak bo i takk nie wiem czy to znaczy "zrobiłeś dobrze" czy "to się wysypie kiedyś". :P
  • Odpowiedz
@SmoothTension: a w jakich przypadkach nie dziala tak jakbys oczekiwal? moze metody nie sa wirtualne? a jesli wywolujesz metody w konstruktorze klasy nadrzednej to tez beda wywołane metody z klasy nadrzednej nawet jesli sa wirtualne.
  • Odpowiedz
@inplaz: zawsze działa dobrze i tak jakbym oczekiwał. O to chodzi, chciałem się tylko upewnić czy to mnie nie zaskoczy gdzieś w przyszłości... te "kilka sytuacji" to bardziej ogólnie, że już nie raz myślałem, że coś jest dobrze, a okazywało się później, że było źle - dlatego wolałem zapytać. :)
  • Odpowiedz
"zrobiłeś dobrze"


@SmoothTension: Wywołanie funkcji jest ok. Za uƶycie new powinni linczować.

czy to mnie nie zaskoczy gdzieś w przyszłości


@SmoothTension: Zaskoczy jeśli wywołasz w konstruktorze klasy nadrzędnej - klasa dziedzicząca jeszcze nie istnieje, więc zostanie wywołana funkcja klasy nadrzędnej.
  • Odpowiedz
Zaskoczy jeśli wywołasz w konstruktorze klasy nadrzędnej - klasa dziedzicząca jeszcze nie istnieje, więc zostanie wywołana funkcja klasy nadrzędnej.


@KrzaQ2: logiczne. :)

Za uƶycie new powinni linczować.


Zrobiłem tak tylko dlatego, że zakładałem konieczność późniejszego castu z Central na IRCentral - spokojnie... :)
  • Odpowiedz