Paradygmaty programowania/Ćwiczenia 5: Programowanie obiektowe — przegląd

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Zadanie 1

Co wypisuje poniższy program w języku C++? Odpowiedz, a potem skompiluj program i sprawdź... Uwaga — do poprawnego skompilowania programu potrzebne będzie dołączenie pliku nagłówkowego (#include <iostream>) i deklaracja przestrzeni nazw (using namespace std;).

     class A
     {
       public:
       virtual void f() { cout << ”A.f”; g(); }
       void g() { cout << ”A.g”; h(); }
       virtual void h() { cout << ”A.h”; }
     };
     class B: public A
     {
       public:
       virtual void f() { cout << ”B.f”; g(); }
       void g() { cout << ”B.g”; h(); }
       virtual void h() { cout << ”B.h”; }
     };
     void main()
    {
      A x = B();
      A* y = new B();
      x.f();
      y–>f();
     }
Wskazówka:

Zadanie 2

Jak zmieni się wynik programu z zadania 1, jeśli usuniemy deklarację virtual przy funkcji f w klasie A? Które deklaracje virtual można usunąć bez żadnej zmiany zachowania programu?

Wskazówka:

Zadanie 3

Wykorzystanie dynamicznego wiązania wywołań z metodami oznacza, że często będziemy odwoływali się do obiektów z klas pochodnych za pomocą zmiennej (wskaźnika) z klasy bazowej. Jakie są tego konsekwencje dla dealokacji pamięci w językach, w których jest ona jawna? Czy z alokacją jest podobnie?

Wskazówka:

Zadanie 4

Napisz program w Javie, dzięki któremu będzie można zobaczyć, czy i kiedy następuje wywołanie metody finalize. Powinien on dać się uruchomić w różnych wariantach, w których będzie potrzebował mniej lub więcej pamięci.

Zadanie 5

Przyjrzyj się dwom poniższym klasom. Czy taki układ to dobry pomysł?

     class Silnik {...};
     class Samochód : Silnik {...};
Wskazówka:

Zadanie 6

Popatrz teraz na takie dwie klasy i porównaj ten przykład z sytuacją z poprzedniego zadania.

     class Samochód {...};
     class Ciężarówka : Samochód {...};
Wskazówka:

Test

Której cechy język obiektowy nie musi posiadać?

abstrakcyjne typy danych

dynamiczne wiązanie wywołań metod z metodami

dziedziczenie

podprogramy rodzajowe

Jakie ograniczenie na przedefiniowywanie metod trzeba narzucić w języku silnie typowanym?

przedefiniowana metoda musi być bezparametrowa

przedefiniowana metoda musi być typu void

przedefiniowana metoda musi zachować taki sam protokół

nie trzeba narzucać żadnych ograniczeń

Rozstrzyganie odwołań do bytów o takiej samej nazwie mających definicje w dwóch klasach bazowych odbywa się w C++ za pomocą:

operatora \:\: (dwa dwukropki)

operatora . (kropka)

tego nie da się zrobić

dziedziczenie wielokrotne nie jest w C++ dozwolone

W języku C++ obiekty zaalokowane na stosie dealokowane są:

niejawnie

za pomocą delete

za pomocą free

w C++ nie ma takich obiektów

Językiem, w którym stosowane jest zawsze dynamiczne wiązanie wywołań z metodami, jest:

C++

C\#

Java

Smalltalk

Językiem, w któym klasa może być samoistna (tzn. nie mieć nadlasy), jest:

C++

C\#

Java

Smalltalk

W języku C++ metody, które mają być wiązane dynamicznie, deklaruje się za pomocą:

operatora -> (strzałka)

słowa abstract

słowa dynamic

słowa virtual

Który nagłówek poprawnie deklaruje w C++ metodę abstrakcyjną?

virtual void p();

virtual void p() \=0;

void p() \=0;

abstract void p();

Klasy "lekkie", deklarowane jako struct, alokowane na stosie i nie pozwalające na dziedziczenie występują w:

C++

C\#

Javie

we wszystkich wymienionych tu językach

Który element nie występuje w JavaScripcie?

klasy

obiekty złożone z par (nazwa własności, wartość)

operator new

zmienne