23
06/19/22 CD5250 OOP med C++ Mats Medin MDH/IDT Objektorienterad programmering forts sid. 1 Objektorienterad programmering forts Fordon Tåg Båt Bil Flygplan

Objektorienterad programmering forts

  • 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

Page 1: Objektorienterad programmering forts

04/22/23 CD5250 OOP med C++Mats Medin MDH/IDT

Objektorienterad programmering fortssid. 1

Objektorienterad programmering forts

Fordon

TågBåtBil Flygplan

Page 2: Objektorienterad programmering forts

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

Page 3: Objektorienterad programmering forts

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

Page 4: Objektorienterad programmering forts

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

Page 5: Objektorienterad programmering forts

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()?

Page 6: Objektorienterad programmering forts

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

Page 7: Objektorienterad programmering forts

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

Page 8: Objektorienterad programmering forts

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

Page 9: Objektorienterad programmering forts

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

Page 10: Objektorienterad programmering forts

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

Page 11: Objektorienterad programmering forts

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

Page 12: Objektorienterad programmering forts

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;}

Page 13: Objektorienterad programmering forts

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.

Page 14: Objektorienterad programmering forts

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

Page 15: Objektorienterad programmering forts

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)

Page 16: Objektorienterad programmering forts

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!

Page 17: Objektorienterad programmering forts

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

Page 18: Objektorienterad programmering forts

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

Page 19: Objektorienterad programmering forts

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

Page 20: Objektorienterad programmering forts

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?

Page 21: Objektorienterad programmering forts

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?

Page 22: Objektorienterad programmering forts

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?

Page 23: Objektorienterad programmering forts

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)