3RO\PRUILQnJUD EHJUHSS Poly - 1 '\QDPLVNELQGQLQJ Poly - 2 3RO\PRUIL ² (Q YLVV NRQVWUXNWLRQ NDQ H[HNYHUDV Sn ROLND VlWW 7LGLJHOOHUVWDWLVNELQGQLQJ ² 9LONHQ IXQNWLRQ VRP VNDOO DQURSDV DYJ UV YLG NRPSLOHULQJHQ 6HQHOOHUG\QDPLVNELQGQLQJ ² 9LONHQ IXQNWLRQ VRP VNDOO DQURSDV DYJ UV YLG H[HNYHULQJHQ 9LUWXHOOIXQNWLRQ ² )XQNWLRQ VRP NDQ DQURSDV PHG G\QDPLVN ELQGQLQJ (Q JnQJ YLUWXHOO lu DOOWLG YLUXHOO 5HQWYLUWXHOOIXQNWLRQ ² (Q PHGOHPVIXQNWLRQ VRP VDNQDU GHILQLWLRQ 3RO\PRUINODVV ².ODVV VRP GHNODUHUDU HOOHU luyhu PLQVW HQ YLUWXHOO IXQNWLRQ $EVWUDNWEDVNODVV ² %DVNODVV PHG VDQQD YLUWXHOOD IXQNWLRQHU JnU HM DWW LQVWDQVHUD GYV VNDSD NODVVHU DY (Q EDVNODVVSHNDUH NDQ WLOOGHODV HQ SHNDUH WLOO HWW REMHNW DY HQ KlUOHGG NODVV //-Form------------------------------------- class Form virtual void draw(); //------------------------------------------ //-Cirkel----------------------------------- class Cirkel : public Form void draw(); //------------------------------------------ //-main------------------------------------- main() //OBS! En pekare av basklassens typ Form *formpekare = new Cirkel() formpekare->draw(); return 0; //------------------------------------------- 1
Exempel på dynamisk bindning, del a Poly - 3 Exempel på dynamisk bindning, del b Poly - 4 #include <iostream.h> #include "person.h" //-Student---------------------------------------------- class Student : public Person Student(const char *namn):person(namn) cout <<"Konstruktor Student\n"; ~Student() cout <<"Destruktor Student\n"; void write() cout <<"Student: " << getname() << endl; //-Fotbollspelare--------------------------------------- class Fotbollsspelare : public Student Fotbollsspelare::Fotbollsspelare(const char* namn):student(namn) cout <<"Konstruktor Fotbollspelare\n"; //-Orienterare------------------------------------------ class Orienterare : public Student Orienterare::Orienterare(const char* namn):student(namn) cout <<"Konstruktor Orienterare\n"; ~Orienterare() cout <<"Destruktor Orienterare\n"; void write() cout <<"Orienterare: " << getname() << endl; //-main------------------------------------------------- void main() Student *stina = new Fotbollsspelare("Stina"); stina->write(); delete stina; ~Fotbollsspelare() cout <<"Destruktor Fotbollsspelare\n"; void write() cout <<"Fotbollsspelare: " << getname() << endl; 6WXGHQW ""! µ'hvwuxnwru )RWEROOVSHODUHµ VDNQDV Programmets utskrift: Konstruktor Student Konstruktor Fotbollspelare Student: Stina Destruktor Student 2
Exempel på dynamisk bindning, del c Poly - 5 Abstrakt basklass. Resturang Oasen, del a Poly - 6 class Student : public Person Student(const char *namn):person(namn) cout <<"Konstruktor Student\n"; virtual ~Student() cout <<"Destruktor Student\n"; //OBS! virtual virtual void write() //OBS! virtual cout <<"Student: " << getname() << endl; void main() Student *stina = new Fotbollsspelare("Stina"); stina->write(); delete stina; (QGD I UlQGULQJHQ L SURJUDPPHW IUnQ I UHJnHQGH H[HPSHO lu DWW L NODVVHQ µ6wxghqwµ Vn KDU GHVWUXNWRUQ RFK PHGOHPVIXQNWLRQHQ µzulwhµ GHNODUHUDWV YLUWXHOOD )RWEROOVSHODUH! 'HVWUXNWRU )RWEROOVSHODUH! Programmets utskrift: Konstruktor Student Konstruktor Fotbollspelare Fotbollsspelare: Stina Destruktor Fotbollsspelare Destruktor Student #include <time.h> #include <stdlib.h> #include <string.h> #include <iostream.h> //-Hungrig---------------------------------------------- class Hungrig Hungrig() ~Hungrig() void konsumerar(restaurang *&valdmat); //-Restaurang------------------------------------------- class Restaurang Restaurang():smak(0)smak = new char[80]; virtual ~Restaurang()delete [] smak; =0; //Sann virtuell funktion! Detta medför att klassen // Restaurang förvandlas till en abstrakt basklass. protected: //protected medför att datamedlemmen smak blir //åtkomligheten i de klasser som ärver av Restaurang char *smak; 3
Abstrakt basklass. Resturang Oasen, del b Poly - 7 Abstrakt basklass. Resturang Oasen, del c Poly - 8 //-Mat-------------------------------------------------- class Mat : public Restaurang Mat()strcpy(smak,"Dagens rätt"); virtual ~Mat() strcat(smak, " är hyfsad."); //-StektSill-------------------------------------------- class StektSill : public Mat StektSill()strcpy(smak,"Sillen"); virtual ~StektSill() strcat(smak, " smakar knaprigt och salt."); //-Palt------------------------------------------------- class Palt : public Mat Palt()strcpy(smak,"Palt"); ~Palt() strcat(smak, " smakar alltid Gott!"); //-FaluKorv--------------------------------------------- class FaluKorv : public Mat FaluKorv()strcpy(smak,"Korven"); virtual ~FaluKorv() strcat(smak," är fantastisk!"); 4
Abstrakt basklass. Resturang Oasen, del d Poly - 9 Abstrakt basklass. Resturang Oasen, del e Poly - 10 //-Fika------------------------------------------------- class Fika : public Restaurang Fika()strcpy(smak,"En kopp fika"); virtual ~Fika() strcat(smak, " är aldrig fel."); //-Bulle------------------------------------------------ class Bulle : public Fika Bulle()strcpy(smak,"Nybakta Bullar"); virtual ~Bulle() strcat(smak, " är inte dumt."); //-Kaka------------------------------------------------- class Kaka : public Fika Kaka()strcpy(smak,"Kakorna"); virtual ~Kaka() strcat(smak, " var sliskiga"); //-konsumerar------------------------------------------- //Copy by referens!!! void Hungrig::konsumerar(Restaurang *&valdmat) if (valdmat!= 0) cout << valdmat->smakar() <<endl; delete valdmat; //Äter upp sin mat valdmat = 0; 5
Abstrakt basklass. Resturang Oasen, del f Poly - 11 'XVNDNXQQD«Poly - 12 - int main(void) Hungrig kallekula; Restaurang *meny[7]; meny[0] = new Mat(); meny[1] = new StektSill(); meny[2] = new Palt(); meny[3] = new FaluKorv(); meny[4] = new Fika(); meny[5] = new Bulle(); meny[6] = new Kaka(); srand(time(0)); int antal = 1 + rand()%7; for (int i=0; i<antal; i++) kallekula.konsumerar(meny[rand()%7]); cout <<endl <<"Tack för maten!" <<endl; for (i=0; i<7; i++) delete meny[i]; return 0; - Exempel på en utskrift Dagens rätt är hyfsad. En kopp fika är aldrig fel. Palt smakar alltid Gott! Sillen smakar knaprigt och salt. 'X VND NXQQD NlQQD WLOO GH YDQGOLJDVWH EHJUHSSHQ 'X VND YHWD KXU PDQ YlOMHU WLGLJ HOOHU VHQ ELQGQLQJ RFK YLOND NRQVHNYHQVHU GHWWD PHGI U 'X VND I UVWn VNLOOQDGHQ PHOODQ YDQGOLJD IXQNWLRQHU RFK YLUWXHOOD IXQNWLRQHU 'X VND I UVWn YDG HQ DEVWUDNW EDVNODVV lu RFK KXU PDQ DQYlQGHU HQ VnGDQ 'X VND NXQQD VNULYD SURJUDP VRP XWQ\WWMDU SRO\PRUIL Tack för maten! 6