Pytania pomocnicze - INF.04
Projektowanie, programowanie i testowanie aplikacji
Pytania pomocnicze rozwijające tematy z pytań egzaminacyjnych. Każde pytanie ma krótką odpowiedź, która pomaga utrwalić wiedzę i przygotować się do egzaminu. Łącznie: 3704.
Strona 46 z 50.
Czym jest klasa abstrakcyjna?
Klasa abstrakcyjna to klasa, której nie można bezpośrednio utworzyć jako obiektu. Służy jako podstawa dla klas pochodnych.
Dlaczego nie można utworzyć instancji klasy abstrakcyjnej?
Klasa abstrakcyjna może zawierać niepełną implementację, np. metody abstrakcyjne bez ciała. Dopiero klasa pochodna uzupełnia brakujące elementy.
Jaka jest różnica między klasą abstrakcyjną a klasą pochodną?
Klasa abstrakcyjna może być bazą dla innych klas. Klasa pochodna dziedziczy po innej klasie i może implementować jej abstrakcyjne metody.
Czym różni się klasa abstrakcyjna od klasy statycznej?
Klasa abstrakcyjna służy do dziedziczenia i nie można jej instancjonować. Klasa statyczna zwykle grupuje statyczne metody i pola, a jej użycie nie opiera się na tworzeniu obiektów.
Czym różni się klasa abstrakcyjna od klasy finalnej?
Klasa abstrakcyjna jest przeznaczona do dziedziczenia, ale nie można tworzyć jej instancji. Klasa finalna zwykle może mieć instancje, ale nie można po niej dziedziczyć.
Co to jest metoda abstrakcyjna?
Metoda abstrakcyjna to metoda zadeklarowana bez implementacji. Klasa pochodna musi ją zaimplementować, jeśli sama nie pozostaje abstrakcyjna.
Kiedy warto użyć klasy abstrakcyjnej?
Warto jej użyć, gdy kilka klas ma wspólne cechy, ale część zachowania musi zostać określona osobno w klasach pochodnych.
Na czym polega dziedziczenie w programowaniu obiektowym?
Dziedziczenie polega na tworzeniu klasy bardziej szczegółowej na podstawie klasy ogólnej. Klasa pochodna przejmuje cechy i zachowania klasy nadrzędnej.
Dlaczego klasa Samochód powinna dziedziczyć po klasie Pojazd, a nie odwrotnie?
Samochód jest szczególnym rodzajem pojazdu, więc powinien dziedziczyć po bardziej ogólnej klasie Pojazd. Relacja dziedziczenia powinna odpowiadać zależności „jest rodzajem”.
Czym różni się klasa nadrzędna od klasy pochodnej?
Klasa nadrzędna zawiera ogólne cechy i metody, np. Pojazd. Klasa pochodna rozszerza lub doprecyzowuje te cechy, np. Samochód.
Jak rozpoznać poprawną relację dziedziczenia między klasami?
Należy sprawdzić, czy można powiedzieć: „klasa pochodna jest rodzajem klasy nadrzędnej”. Przykład: samochód jest pojazdem, ale pojazd nie musi być samochodem.
Jakie cechy klasy Pojazd mogłaby odziedziczyć klasa Samochód?
Klasa Samochód mogłaby odziedziczyć np. prędkość, masę, metodę ruszania lub zatrzymywania. Następnie może dodać własne cechy, np. liczbę drzwi.
Czy brak powiązania między klasami zawsze oznacza błąd projektowy?
Nie zawsze. Jeśli klasy opisują niezależne pojęcia, brak relacji jest poprawny. W przypadku Samochodu i Pojazdu relacja dziedziczenia jest jednak logiczna.
Na czym polega podstawowe użycie metod wirtualnych?
Metody wirtualne umożliwiają dynamiczne wiązanie, czyli wybór właściwej wersji metody w czasie działania programu. Dzięki temu można wywołać metodę klasy pochodnej przez wskaźnik lub referencję do klasy bazowej.
Czym różni się dynamiczne wiązanie od statycznego wiązania metod?
Przy statycznym wiązaniu wybór metody następuje podczas kompilacji. Przy dynamicznym wiązaniu decyzja zapada dopiero w czasie wykonywania programu.
Jaki jest związek metod wirtualnych z polimorfizmem?
Metody wirtualne pozwalają realizować polimorfizm dynamiczny. Ten sam kod może wywoływać różne wersje metody zależnie od rzeczywistego typu obiektu.
Dlaczego metoda w klasie bazowej powinna być oznaczona jako virtual?
Słowo kluczowe `virtual` informuje kompilator, że metoda może zostać przesłonięta w klasie pochodnej i powinna być wybierana dynamicznie. Bez tego często zostanie wywołana wersja z klasy bazowej.
Czy metody wirtualne służą do wielokrotnego dziedziczenia?
Nie. Metody wirtualne służą do dynamicznego wiązania i polimorfizmu, a nie do umożliwiania wielokrotnego dziedziczenia.
Kiedy w praktyce warto stosować metody wirtualne?
Warto ich używać, gdy klasy pochodne mają mieć własne wersje tej samej operacji, np. różne figury obliczające pole lub różne typy użytkowników wykonujące inną akcję.
Co oznacza przesłonięcie metody w klasie pochodnej?
Przesłonięcie oznacza zdefiniowanie w klasie pochodnej metody o takiej samej sygnaturze jak metoda w klasie bazowej. Dzięki temu obiekt klasy pochodnej może wykonać własną wersję tej metody.
Czym jest klasa bazowa w programowaniu obiektowym?
Klasa bazowa to klasa, z której dziedziczą inne klasy. Udostępnia im wspólne pola, właściwości i metody.
Jaka jest różnica między klasą bazową a klasą pochodną?
Klasa bazowa przekazuje wspólne elementy, natomiast klasa pochodna je dziedziczy i może rozszerzać lub modyfikować zachowanie.
Czy każda klasa bazowa musi zawierać metody wirtualne?
Nie. Klasa bazowa może zawierać metody wirtualne, ale nie jest to warunek konieczny, aby była klasą bazową.
Po co stosuje się klasy bazowe?
Klasy bazowe ograniczają powtarzanie kodu i pozwalają definiować wspólne cechy dla wielu podobnych klas.
Czy klasa bazowa może mieć własne atrybuty i metody?
Tak. Klasa bazowa zwykle zawiera atrybuty i metody wspólne dla klas pochodnych.
Czy klasa, która nie może być dziedziczona, jest klasą bazową?
Nie. Klasa, której nie można dziedziczyć, nie pełni roli klasy bazowej dla innych klas.
Do czego służy blok try w C++?
Blok `try` zawiera kod, w którym może wystąpić wyjątek. Jeśli wyjątek zostanie zgłoszony, program szuka pasującego bloku `catch`.
Jaką rolę pełni blok catch w C++?
Blok `catch` przechwytuje wyjątek i pozwala go obsłużyć, np. wyświetlić komunikat błędu lub wykonać kod naprawczy.
Czym różni się throw od try i catch?
`throw` służy do zgłoszenia wyjątku, natomiast `try` i `catch` służą do jego przechwycenia i obsługi.
Czy w C++ istnieje słowo kluczowe finally do obsługi wyjątków?
W standardowym C++ nie ma słowa kluczowego `finally`. Sprzątanie zasobów zwykle realizuje się przez destruktory i zasadę RAII.
Dlaczego odpowiedź throw i handle jest niepoprawna?
`throw` jest poprawnym słowem kluczowym C++, ale `handle` nie jest standardowym słowem kluczowym do obsługi wyjątków. Podstawowa para obsługi wyjątków to `try` i `catch`.
Co się stanie, jeśli wyjątek nie zostanie przechwycony?
Jeśli wyjątek nie trafi do pasującego bloku `catch`, program może zakończyć działanie w sposób awaryjny, zwykle przez wywołanie `std::terminate()`.
Do czego służy instrukcja throw w C++?
Instrukcja `throw` służy do zgłoszenia wyjątku, czyli poinformowania programu o sytuacji błędnej lub wyjątkowej.
Jaka jest różnica między throw a catch?
`throw` zgłasza wyjątek, natomiast `catch` przechwytuje go i pozwala obsłużyć błąd.
Jaką rolę pełni blok try w obsłudze wyjątków?
Blok `try` zawiera kod, w którym może zostać zgłoszony wyjątek. Jeśli wyjątek wystąpi, sterowanie może przejść do odpowiedniego bloku `catch`.
Co stanie się, jeśli wyjątek zgłoszony przez throw nie zostanie przechwycony?
Jeśli wyjątek nie zostanie obsłużony przez żaden pasujący blok `catch`, program zwykle kończy działanie w sposób awaryjny.
Czy throw zawsze przerywa działanie całego programu?
Nie zawsze. `throw` przerywa normalne wykonywanie bieżącego fragmentu kodu, ale jeśli wyjątek zostanie przechwycony i obsłużony, program może działać dalej.
Jakie typy wartości można zgłaszać za pomocą throw?
W C++ można zgłaszać różne typy wartości, np. liczby, napisy, obiekty klas lub obiekty wyjątków standardowych, takie jak `std::runtime_error`.
Do czego służy blok catch?
Blok `catch` służy do przechwycenia i obsłużenia wyjątku, który wystąpił w bloku `try`. Dzięki temu program może zareagować na błąd zamiast natychmiast się zakończyć.
Co oznacza, że wyjątek jest nieobsłużony?
Oznacza to, że w programie nie znaleziono pasującego bloku `catch`, który mógłby przechwycić dany wyjątek. W efekcie program zwykle kończy działanie z błędem.
Czy kompilator ignoruje błędy zgłoszone w czasie działania programu?
Nie. Kompilator sprawdza kod przed uruchomieniem, ale wiele wyjątków pojawia się dopiero w czasie działania programu. Takie błędy obsługuje mechanizm wyjątków, a nie kompilator.
Jaka jest rola instrukcji throw?
Instrukcja `throw` służy do jawnego zgłoszenia wyjątku. Po jej wykonaniu program szuka odpowiedniego bloku `catch`, który obsłuży ten wyjątek.
Czy program zawsze kontynuuje działanie po wystąpieniu wyjątku?
Nie. Program może kontynuować działanie tylko wtedy, gdy wyjątek zostanie poprawnie obsłużony. Nieobsłużony wyjątek najczęściej powoduje zakończenie programu.
Dlaczego warto obsługiwać wyjątki?
Obsługa wyjątków pozwala przewidzieć sytuacje błędne, wyświetlić czytelny komunikat, zapisać informacje do logu lub wykonać działanie awaryjne. Zwiększa to stabilność aplikacji.
Do czego służy blok try w C++?
Blok `try` zawiera kod, w którym może wystąpić wyjątek. Jeśli wyjątek zostanie zgłoszony, sterowanie przechodzi do pasującego bloku `catch`.
Do czego służy blok catch w C++?
Blok `catch` przechwytuje wyjątek zgłoszony w bloku `try` i wykonuje kod obsługi błędu. Może przechwytywać konkretny typ wyjątku albo wszystkie wyjątki przez `catch(...)`.
Jaką rolę pełni instrukcja throw w C++?
Instrukcja `throw` służy do zgłoszenia wyjątku. Po jej wykonaniu program szuka najbliższego pasującego bloku `catch`.
Czy w C++ istnieje blok finally?
W standardowym C++ nie ma bloku `finally`. Do automatycznego zwalniania zasobów używa się głównie destruktorów i techniki RAII.
Czy zapis catch bez nawiasów jest poprawny w prawdziwym kodzie C++?
Nie, w rzeczywistym C++ blok `catch` powinien mieć nawiasy z typem wyjątku, np. `catch (const exception& e)` albo `catch (...)`. W zadaniach egzaminacyjnych zapis bywa uproszczony.
Czym różni się catch(...) od catch z konkretnym typem wyjątku?
`catch(...)` przechwytuje każdy wyjątek, niezależnie od jego typu. `catch (typ e)` obsługuje tylko wyjątki pasujące do wskazanego typu.
Po co tworzy się własne wyjątki w C++?
Własne wyjątki pozwalają dokładniej opisać błędy charakterystyczne dla danej aplikacji. Dzięki nim kod obsługi błędów jest czytelniejszy i łatwiejszy w utrzymaniu.
Dlaczego własny wyjątek powinien dziedziczyć po std::exception?
Dziedziczenie po `std::exception` pozwala traktować własny wyjątek tak jak standardowe wyjątki C++. Umożliwia też obsługę przez `catch (const std::exception& e)`.
Do czego służy metoda what() w klasie wyjątku?
Metoda `what()` zwraca tekstowy opis błędu. Jest często przesłaniana we własnych klasach wyjątków.
Jak zgłasza się wyjątek w C++?
Wyjątek zgłasza się instrukcją `throw`, np. `throw MojWyjatek();`. Samo zdefiniowanie klasy wyjątku nie powoduje jego automatycznego zgłoszenia.
Jak poprawnie przechwytywać wyjątki w C++?
Najczęściej przechwytuje się je przez referencję stałą, np. `catch (const std::exception& e)`. Pozwala to uniknąć kopiowania i obsłużyć także klasy pochodne.
Czy pusty blok catch definiuje własny wyjątek?
Nie. Pusty blok `catch` jedynie przechwytuje wyjątek i nic z nim nie robi. Własny wyjątek definiuje się przez utworzenie odpowiedniej klasy.
Dlaczego promieniowanie UV zalicza się do zagrożeń fizycznych?
Promieniowanie UV jest formą promieniowania elektromagnetycznego, czyli czynnikiem fizycznym. Może uszkadzać skórę i oczy, dlatego stanowi zagrożenie w środowisku pracy.
Jak odróżnić zagrożenie fizyczne od psychospołecznego?
Zagrożenie fizyczne wynika z czynników takich jak hałas, temperatura, promieniowanie czy drgania. Zagrożenie psychospołeczne dotyczy np. stresu, konfliktów, presji czasu lub złych relacji w zespole.
Czy brak ergonomicznego stanowiska pracy jest zagrożeniem fizycznym?
Nie jest to typowy przykład zagrożenia fizycznego, lecz zagrożenia ergonomicznego. Może powodować bóle kręgosłupa, przeciążenia mięśni i problemy ze wzrokiem.
Jakie są przykłady zagrożeń fizycznych w pracy biurowej lub informatycznej?
W pracy biurowej mogą wystąpić m.in. niewłaściwe oświetlenie, hałas, nieodpowiednia temperatura oraz długotrwała praca przy monitorze. Promieniowanie UV jest mniej typowe, ale może występować przy pracy w silnym nasłonecznieniu lub przy specjalistycznych urządzeniach.
Jak można ograniczyć ryzyko związane z promieniowaniem UV?
Należy stosować okulary ochronne, osłony, odzież ochronną i kremy z filtrem, a także ograniczać czas ekspozycji. Ważne są również szkolenia BHP i właściwa organizacja pracy.
Dlaczego obciążenie psychiczne nie jest zagrożeniem fizycznym?
Obciążenie psychiczne dotyczy stresu, presji, odpowiedzialności lub przeciążenia informacyjnego. Nie jest czynnikiem fizycznym, choć może prowadzić do realnych problemów zdrowotnych.