Upload
eytan
View
51
Download
0
Embed Size (px)
DESCRIPTION
Fordon. Tåg. Båt. Bil. Flygplan. Objektorienterad programmering forts. Drawable. Persistent. position bitmap. storage_file_name object_id. Box. Cirkel. Linje. bredd hojd. end_a end_b. centrum radie. Bilregpost agare marke regnr. Bankkonto. agare saldo. Text_Box. Pil. - PowerPoint PPT Presentation
Citation preview
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 1
Objektorienterad programmering forts
Fordon
TågBåtBil Flygplan
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 2
Hur är arv implementerat?
Drawablepositionbitmap
Persistentstorage_file_nameobject_id
Boxbreddhojd
Text_Boxtextfont
Cirkel
centrumradie
Linjeend_aend_b
Pilriktning
Bankkontoagaresaldo
Bilregpostagaremarkeregnr
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 3
Implementation av arv
positionbitmap
centrumradie
Cirkel mincirkel;
datamedlemmar från basklassen
underklass-specifika datamedlemmar
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 4
Vad ärvs?
• medlemsfunktioner ärvs• medlemsdata ärvs• friends (vänner) ärvs inte• konstruktor ärvs inte
– basklassens konstruktor anropas, vanligen från initieringslistan för att sätta rätt värden i basklassdelen
– en nivå upp kan man anropa
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 5
Åtkomst av överklassmedlemmar
protected: int x;
MyBaseClass
SubClassA SubClassB
A myaobj1;
x A myaobj2;
x
B mybobj;
xdoIt()
doIt()?
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 6
Virtuell funktion
• Komma åt subtyp-specifik implementation av virtuella funktionsanrop från bastypen
• den virtuella hanteringen fungerar bara om objektet hanteras via pekare eller referens– statiskt allokerat objekt ÄR av den statiska
typen
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 7
Implementation av objekt med statiska och virtuella metoder
int xfloat f
_vptr_Myclass
type_info för Myclass
Virtual tableför Myclass
static int Myclass::noOfObjs
Myclass::print(ostream &)
Myclass::draw()
Myclass::~Myclass()static int Myclass::getNoOfObjs()
int Myclass::get_x()Virtuella metoder nås via vptr
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 8
Pure virtual function
class Drawable{ virtual void draw() = 0; virtual void draw() = 0; ...
“= 0” markerar pure virtual function
Definierar (en del av) ett snittutan att implementera det
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 9
Abstrakt överklass
En klass med en eller flera pure virtual functions är en abstrakt överklass.
En klass med bara pure virtual functions (dvs ingen funktion är implementerad i den) är en rent abstrakt överklass.
Syftet med den är bara att specificera ett snitt som underklasserna ska tillhandahålla
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 10
Arv av beteende
• Ger även arv av implementation– utom då man jobbar med pure virtual
function/rent abstrakta överklasser
Synligt arv
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 11
Arv av implementation
class Stack : private Vector{ public: push(Elem e) {/* peta i vektorn */} Elem pop() { /* peta i vektorn */}}
Vad händer om man använder public inheritance istället?
Stack teststack;teststack.push(x);teststack.push(y);t=teststack.pop();
Vi får ett väldigt fult anropssnitt!t=teststack[10];teststack.push_back(e);
Privat eller skyddat arv
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 12
...men en stack är inte en vektor
Snyggare, renare, med en vektor som beståndsdel i stället för arv:
class Stack{ public: push(Elem e) { theStack.pushBack(e); } Elem pop() { /* ... */ } private: Vector theStack;}
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 13
Konstruktor-destruktor och arv När ett objekt skapas sker följande: 1. Konstruktorn för ev. överklass anropas alltid först. 2. Konstruktorerna för den aktuella klassens datamedlemmar anropas 3. Satserna i den aktuella klassens konstruktor exekveras.
När ett objekt tas bort sker följande: 1. Satserna i den aktuella klassens destruktor exekveras. 2. Destruktorerna för den aktuella klassens datamedlemmar anropas 3. Destruktorn för ev. överklass anropas.
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 14
Multipelt arvDrawable
draw()move()
positionbitmap
Persistent
save()restore()
storage_file_nameobject_id
Boxlengthwidth
Circle
centerradius
Lineend_aend_b
Persistent_drawable
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 15
Multipelt arv: iostream
istream ostream
iostreamifstream ofstream
fstream
class ostream : public ios
ios
format_statecondition_statelocalestreambuf
gcount xxx
yyy
class iostream : public istream, public ostream
class istream : public ios
(inte riktigt rätt)
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 16
över-klass-delenfrånios
format_statecondition_statelocalestreambuf
gcountistreams“egen”underklassbit
format_statecondition_statelocalestreambuf
xxx
över-klass-delenfrånios
ostreams“egen”underklassbit
istream object ostream objectiostream object???
format_statecondition_statelocalestreambuf
gcount
format_statecondition_statelocalestreambuf
xxxyyy
frånostream
frånistream
iostreams“egen”underklassbit
Kompileringsfel - dock endast vidförsök att accessa de dubblerade delarna!
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 17
Multipelt arv: iostream
istream ostream
iostreamifstream ofstream
fstream
class ostream : virtual public ios
ios
format_statecondition_statelocalestreambuf
gcount xxx
yyy
class iostream : public istream, public ostream
class istream : virtual public ios
med virtual inheritance
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 18
Virtual inheritanceiostream object
format_statecondition_statelocalestreambuf
gcount
xxx
yyy iostreams“egen”underklassbit
en enda ios-bit!
från istream
från ostream
virtuell basklass
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 19
Konstruktor-destruktor och arv När ett objekt skapas sker följande: 1. Konstruktorn för ev. överklass anropas alltid först. 2. Konstruktorerna för den aktuella klassens datamedlemmar anropas 3. Satserna i den aktuella klassens konstruktor exekveras.
När ett objekt tas bort sker följande: 1. Satserna i den aktuella klassens destruktor exekveras. 2. Destruktorerna för den aktuella klassens datamedlemmar anropas 3. Destruktorn för ev. överklass anropas.
i deriveringslistans turordning
baklänges enligt deriveringslistans turordning
multipelt
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 20
skydda konstruktorn på abstrakt överklass
Drawable
rita()flytta()
positionbitmap
Boxbreddhojd
Text_Boxtextfont
Cirkel
centrumradie
Linjeend_aend_b
Pilriktningbyt_ riktning()
class Drawable{ protected: Drawable(); …..
Varför inte private?
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 21
Virtuell destruktordelete drawable_ptr; Delete genom basklass-pekare tar bara bort basklass-
objekt-delen om inte destruktorn är virtual!
adasddfasfassfdsfd
Box* Cirkel* Pil*Linje* Text_Box*
Är protectedbasklass- destruktoren bra ide?
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 22
typeid och type_info
#include <typeinfo>type_info ti;class Minklass : public Overklass {…}Minklass mittobj;Overklass *minpekare = & mittobj;ti = typeid(*myptr);cout << ti.name() << endl; // Vad händer?
04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT
Objektorienterad programmering fortssid. 23
typeid och type_info fortscout << ti << endl; // Vad händer?klass med virtuella funktioner:• det av myptr utpekade objektets dynamiska
typ skrivs ut, dvs Minklassklass utan virtuella funktioner:• den statiska typen hos uttrycket (*myptr)
skrivs ut, dvs Basklasstypeid funkar på alla slags typer och uttryck:
typeinfo(myint), typeinfo(a || b), typeinfo(3.1415)