background image

Programowanie obiektowe, opracowanie: dr inż. Grzegorz Filo 

IIS, M-72 

Politechnika Krakowska im. Tadeusza Kościuszki 

Wydział Mechaniczny 

Instytut Informatyki Stosowanej M-7 

Zakład Grafiki i Modelowania Komputerowego M-72 

 

Laboratorium: Klasy abstrakcyjne i polimorfizm 

Programowanie obiektowe  Nr. proj.: 06b, 2 x 45 minut 

dr inż. Grzegorz Filo 

 
1. Cel laboratorium 

Celem ćwiczenia jest zbudowanie aplikacji obliczeniowej przy wykorzystaniu technik 

definiowania klas abstrakcyjnych i mechanizmów polimorfizmu. Aplikację należy 
zaimplementować w środowisku Turbo C++ 2006. 
2. Wymagane oprogramowanie 

Zadanie należy wykonać przy wykorzystaniu środowiska programowania 

 

Borland Turbo C++ 2006. 
3. Zadanie do wykonania 

Temat: Należy zmodyfikować aplikację wykonaną w ramach projektu 6a: 

3.1) Zastosować następujący sposób dziedziczenia: 

TBryla  

    TKula 

 

TStozek 

 

TWalec    TRura 

Abstrakcyjna klasa 

TBryla

 powinna zawierać:  

•  składnik 

Objetosc

 typu 

double

 w sekcji 

protected

•  czysto wirtualną metodę 

double Oblicz()

 w sekcji 

protected

•  metodę wirtualną 

void PokazDane(TStringGrid*)

 w sekcji 

public

•  metodę 

void  Wypisz(TLabel*)

 w sekcji 

public

 formatującą i wypisującą 

w kontrolce 

TLabel

 wartość objętości bryły. 

Ciało metody PokazDane() w klasie 

TBryla

 

void TBryla::PokazDane(TStringGrid* G){ 
  G‐>RowCount = 2; 

   

  G‐>Cells[0][0]="Nazwa"; 

   

  G‐>Cells[1][0]="Wartość"; 
}; 

3.2) W klasach potomnych należy: 

•  przedefiniować metody wirtualne z klasy abstrakcyjnej wypisując kolejne parametry 

definiowane w klasach pochodnych, np. w klasie TKula: 

void TKula::PokazDane(TStringGrid* G){ 
  TBryla::PokazDane(G); 
  G‐>Cells[0][1]="R"; 
  G‐>Cells[1][1]=FloatToStrF(R,ffFixed,6,2); 
}; 

•  zdefiniować funkcje przypisujące wartości zdefiniowanym w każdej klasie 

parametrom. Należy zastosować konwencję nazw set-get, np. w klasie 

TKula

 należy 

zdefiniować publiczną funkcję 

void setR(double)

•  z klas potomnych należy usunąć metodę 

void Wypisz()

background image

Programowanie obiektowe, opracowanie: dr inż. Grzegorz Filo 

IIS, M-72 

3.3) Logika działania aplikacji jak w laboratorium 6a, należy uwzględnić następujące 
wskazówki: 

• 

w klasie formatki (domyślnie 

TForm1

) w sekcji 

public

 zdefiniować wskaźniki do 

obiektów poszczególnych klas, np.: 

TBryla* B; 
TKula* Kula;   // itd. 

•  w konstruktorze formatki utworzyć obiekty pokazywane przez wskaźniki (oprócz 

TBryla

) i wywołać programowo kliknięcie na komponent 

TRadioGroup

, natomiast w 

metodzie FormDestroy zniszczyć. 

• 

w procedurze obsługi kliknięcia na 

TRadioGroup

 przypisać wskaźnik 

TBryla

:

 

     switch(RadioGroup1‐>ItemIndex){ 
 

    case 0: B = Kula; break; 

 

    case 1: B = Stozek; break; 

 

    case 2: B = Walec; break; 

 

    case 3: B = Rura; break; 

     } 
     B‐>PokazDane(StringGrid1); 
     B‐>Wypisz(Label1); 

•  w procedurze obsługi kliknięcia na przycisk przypisać dane stosując rzutowanie RTTI 

oraz mechanizm obsługi wyjątków: 


   

double x; 

   

Label1‐>Caption = "Pole = ???"; 
try{ 

 

if(dynamic_cast<TKula*>(B)){ 

 

  x = StrToFloat(StringGrid1‐>Cells[1][1]); 

 

  if (x<0) throw ERangeError("Ujemna wartość R !");; 

 

  (dynamic_cast<TKula*>(B))‐>setR(x); 

 

}; 

 

// itd 
B‐>Wypisz(Label1); 

  }catch(EConvertError & e){ 
 

ShowMessage( "Niepoprawna wartość parametru"); 

  }catch(ERangeError & e){ 
 

ShowMessage(e.Message); 

  } 

 

4. Bibliografia 

[1] Matulewski 

J., 

C++Builder i Turbo C++. Podstawy, Wydawnictwo Helion, 

Gliwice 2006; 

[2] Daniluk 

A., 

C++ Builder Borland Deweloper Studio 2006. Kompendium programisty

Wydawnictwo Helion, Gliwice 2006; 

[3] Matulewski 

J. 

C++Builder 2006. 222 gotowe rozwiązania, Wydawnictwo Helion, 

Gliwice 2006;