Uniwersytet Zielonogórski
Instytut Sterowania i Systemów Informatycznych
Programowanie obiektowe w C++
Lista 6 Polimorzm oraz funkcje wirtualne
1 wiczenia
1. Dla schematu dziedziczenia A → B → C:
(a) zdeniowa¢ klasy przy zaªo»eniu, »e klasa A ma
by¢ klas¦ abstrakcyjn¡,
(b) wyposa»y¢ wszystkie klasy w wirtualn¡ metod¦
nazwa zwracaj¡c¡ nazw¦ klasy,
(c) doda¢ destruktory wirtualne,
(d) doda¢ funkcj¦ globaln¡ zaprzyja¹nion¡ z klas¡
A, tak aby mogªa wykona¢ to samo co funkcje
z podpunktu (b).
2. Napisa¢ denicj¦ klasy z trzema przeªadowanymi
funkcjami wirtualnymi. Stworzy¢ now¡ klas¦ dzie-
dzicz¡ca po pierwszej, z tylko jedn¡ przeªadowan¡
funkcj¡ wirtualn¡. Utworzy¢ obiekt klasy pochodnej
i odpowiedzie¢ na nast¦puj¡ce pytania:
(a) Czy mo»na wywoªa¢ wszystkie trzy bazowe
funkcje poprzez obiekt klasy pochodnej i ewen-
tualnie w jaki sposób?
(b) Czy po zrzutowaniu adresu klasy pochodnej na
adres klasy bazowej mo»na wywoªa¢ wszystkie
funkcje?
(c) Czy po usuni¦ciu denicji funkcji w klasie po-
chodnej mo»na wykona¢ podpunkt (a)?
3. Poprawi¢ bª¦dy programie, a nast¦pnie przeanalizo-
wa¢ jego dziaªanie.
#include <iostream>
|
| void main() {
using namespace std;
|
X ob1;Y ob2; Z ob3;
|
ob2.fun1; ob2.fun2;
class X {
|
public:
|
X *wsk = &ob2;
static int x1;
|
wsk>fun1(); wsk>fun2();
void virtual fun1()
|
wsk>X::fun1(); wsk>X::fun2();
{ cout<<"funkcja fun1 z klasy X"; } |
static void virtual fun2()=0;
|
wsk = &ob3;
};
|
wsk>fun1(); wsk>fun2();
|
wsk>X::fun1(); wsk>Z::fun2();
class Y: public X {
| }
public:
|
void virtual fun1()
|
{ cout<<"funkcja fun1 z klasy Y"; } |
void fun2()
|
{ cout<<"funkcja fun2 z klasy Y"; } |
};
|
|
class Z: public Y{
|
public:
|
void virtual fun1()
|
{ cout<<"funkcja fun1 z klasy Z"; } |
void virtual fun2()=0
|
{ cout<<"funkcja fun2 z klasy Z"; } |
};
|
4. W ¢wiczeniu (1) zastanowi¢ si¦ jak zrealizowa¢ za-
danie konstruktora wirtualnego.
5. Zrealizowa¢ poni»szy schemat dziedziczenia (popra-
wi¢ tak»e relacj¦ pomi¦dzy klasami):
Ka»da z klas powinna posiada¢ funkcje wirtualne
rysuj(), przesun() oraz obrot(). Dokona¢ wir-
tualnego wywoªania tych funkcji dla ró»nego typu
obiektów.
6. Napisa¢ klas¦ zawieraj¡c¡ dwie metody wykonuj¡ce
to samo zadanie, jedn¡ w wersji wirtualnej, a dru-
g¡ niewirtualnej. Doda¢ now¡ klas¦ dziedzicz¡c¡ z
wspomnianej klasy, a nast¦pnie porówna¢ czasy wy-
woªania ka»dej z funkcji (posªu»y¢ si¦ np. funkcj¡
clock() plik nagªówkowy time.h).
7. Napisa¢ krótki program obrazuj¡cy ró»nic¦ pomi¦-
dzy wywoªaniem funkcji wirtualnej wewn¡trz nor-
malnej funkcji skªadowej klasy, a wywoªaniem funk-
cji wirtualnej wewn¡trz konstruktora. Program po-
winien pokaza¢, »e takie dwa wywoªania generuj¡
ró»ne wyniki.
8. Dane s¡ klasy bazowe rezystor, kondensator i cew-
ka. Wyprowadzi¢ z nich klasy pochodne: cewka rze-
czywista i kondensator rzeczywisty, a z nich z kolei
ukªad RLC. Maj¡c do dyspozycji tak przygotowany
zestaw elementów prostych, zdeniowa¢ ukªad_rez
zawieraj¡cy dynamiczn¡ tablic¦ wska¹ników do ta-
kich obiektów. Wyznaczy¢ charakterystyk¦ rezonan-
sow¡ w zadanym przedziale cz¦stotliwo±ci dla szere-
gowego i równolegªego poª¡czenia elementów.