Object-Oriented Programming

44
Object-Oriented Programmin Object-Oriented Programmin g ( g ( 物物物物物物物物 物物物物物物物物 ) ) Lecturer: Liao Ping-Lun ( Lecturer: Liao Ping-Lun ( 物物物 物物物 ) ) EMail: EMail: [email protected] [email protected]

Transcript of Object-Oriented Programming

Object-Oriented Programming Object-Oriented Programming (( 物件導向程式設計物件導向程式設計 ))

Lecturer: Liao Ping-Lun (Lecturer: Liao Ping-Lun ( 廖柄㷍廖柄㷍 ))EMail: EMail: [email protected]@gmail.com

AgendaAgendaProject Complex classProject Complex classProject TStack with PersonProject TStack with PersonInheritance (Inheritance ( 繼承繼承 ) ) Polymorphism (Polymorphism ( 多型多型 ) )

Overloaded Operators (Overloaded Operators ( 運算子重運算子重載載 ))

operator[] (subscript operator)operator[] (subscript operator) char city[40] = "Taipei";char city[40] = "Taipei"; cout << city[1] << endl; // display 'a'cout << city[1] << endl; // display 'a'

String opera("The Duck");String opera("The Duck"); char& String::operator[](int)char& String::operator[](int) { return str[i]; } // opera[0] = 'T';{ return str[i]; } // opera[0] = 'T';

const char& String::operator[](int i) constconst char& String::operator[](int i) const { return str[i]; } // cout << opera[4];{ return str[i]; } // cout << opera[4]; // char ch = opera[3];// char ch = opera[3];

Overloaded Operators (Overloaded Operators ( 運算子重運算子重載載 ))

operator= (assignment operator)operator= (assignment operator)Person me;Person me;Person him = me; // not an assignmentPerson him = me; // not an assignmenthim = me; // assignmenthim = me; // assignment

為什麼是 為什麼是 return by reference?return by reference?因為修改的是自己因為修改的是自己

Overloaded Operators (Overloaded Operators ( 運算子重運算子重載載 ))

重載 重載 MyStackMyStackoperator=operator=operator[] operator[]

Project Complex ClassProject Complex ClassDefault ConstructorDefault Constructor

With default valueWith default valueCopy ConstructorCopy ConstructorOperator overloadinOperator overloadingg

operator+operator+operator-operator-operator*operator*operator<<operator<<operator>>operator>>

示範示範operator+operator+

Project Complex ClassProject Complex ClassSolutionSolution

Pointer and objectPointer and objectString glamour;String glamour;String *first = &glamour; String *first = &glamour; // assign object address// assign object addressString *gleep = new String; String *gleep = new String; // default constructor// default constructor

// invoke String(const char*) constructor// invoke String(const char*) constructorString *glop = new String("me me me");String *glop = new String("me me me");

// invoke String(const String&) constructor// invoke String(const String&) constructorString *favorite = new String(glamour);String *favorite = new String(glamour);if(glamour < *first) if(glamour < *first) // compare object value// compare object value

Implicit and explicit type conversiImplicit and explicit type conversiononclass Stringclass String{{ //...//... explicit String( const char* pstr ); // str = String("ABC");explicit String( const char* pstr ); // str = String("ABC"); operator char*();operator char*();};};

String str;String str;str = "TEST"; //Error: cannot convert "TEST" to String istr = "TEST"; //Error: cannot convert "TEST" to String i

mplicitlymplicitlychar *pstr = str; // char *pstr = (char*)str;char *pstr = str; // char *pstr = (char*)str;

InheritanceInheritanceIs-a relationshipIs-a relationshipPublic inheritancePublic inheritanceInitializer list in default constructorInitializer list in default constructorVirtual member functionVirtual member functionStatic binding and dynamic bindingStatic binding and dynamic bindingAbstract base classAbstract base classPure virtual functionPure virtual functionPublic interfacePublic interface

Is-a & has-a relationshipsIs-a & has-a relationships直線、矩形是圖形,但畫布上有好多圖形!直線、矩形是圖形,但畫布上有好多圖形!

Inheriting classInheriting classBase classBase classDerived classDerived class

Using Derived classUsing Derived class跟在使用一般類別一樣的語法。跟在使用一般類別一樣的語法。

InheritanceInheritance

Inheritance classInheritance classclass RatedPlayerclass RatedPlayer: public: public TableTennisPlaye TableTennisPlaye

rr{{ private:private: int rating;int rating; public:public: ......};};

Base and Derived Class ObjectBase and Derived Class Object

Access specify without inheritanceAccess specify without inheritance

Initilizer ListInitilizer ListDerived class Derived class 設定 設定 Base class Base class 的 的 private private member variables member variables 時時

RatedPlayer::RatedPlayer(unsigned int r, const chRatedPlayer::RatedPlayer(unsigned int r, const char * fn, const char * ln, bool ht) : TableTennisPlar * fn, const char * ln, bool ht) : TableTennisPlayer(fn, ln, ht)ayer(fn, ln, ht)

{{rating = r;rating = r;

}} RatedPlayer rplayer1(1140, "Mallory", "Duck", truRatedPlayer rplayer1(1140, "Mallory", "Duck", tru

e);e);

Initilizer ListInitilizer List

RatedPlayer::RatedPlayer(unsigned int r, const chRatedPlayer::RatedPlayer(unsigned int r, const char * fn, const char * ln, bool ht) : TableTennisPlar * fn, const char * ln, bool ht) : TableTennisPlayer(fn, ln, ht), rating(r)ayer(fn, ln, ht), rating(r)

{}{} RatedPlayer rplayer1(1140, "Mallory", "Duck", truRatedPlayer rplayer1(1140, "Mallory", "Duck", tru

e);e);

Default constructor in derived clasDefault constructor in derived classs

Completely constructors in base classCompletely constructors in base classUsing initializer list to build up defaultUsing initializer list to build up defaultconstructor in derived classconstructor in derived classData members in initialization in derived Data members in initialization in derived classclass

Access specify with inheritanceAccess specify with inheritance

Special relationship between base and deriSpecial relationship between base and derived classved class

Using base class methodUsing base class methodUpward castingUpward castingDownward casting is not allowedDownward casting is not allowed

Using base class methodUsing base class methodRatedPlayer rplayer1(1140, "Mallory", "Duck", true);RatedPlayer rplayer1(1140, "Mallory", "Duck", true);rplayer1.Name();rplayer1.Name();// derived object uses base method// derived object uses base method

Upward castingUpward castingRatedPlayer rplayer1(1140, "Mallory", "Duck", true);RatedPlayer rplayer1(1140, "Mallory", "Duck", true);

TableTennisPlayer &rt = rplayer;TableTennisPlayer &rt = rplayer;TAbleTennisPlayer *pt = &rplayer;TAbleTennisPlayer *pt = &rplayer;

rt.Name(); rt.Name(); // invoke Name() with reference// invoke Name() with referencept->Name(); pt->Name(); // invoke Name() with pointer// invoke Name() with pointer

Downward casting is not allowDownward casting is not allowededTableTennisPlayer player("Tara", "Boomdea", falTableTennisPlayer player("Tara", "Boomdea", fal

se);se);RatedPlayer &rrp = player; RatedPlayer &rrp = player; // not allowed// not allowedRatedPlayer *prp = &player; RatedPlayer *prp = &player; // not allowed// not allowed

Implicit upward castingImplicit upward castingvoid method(void method(const Base_class &bcconst Base_class &bc););

void Show(const TableTennisPlayer &rt)void Show(const TableTennisPlayer &rt){{ cout << "Name: ";cout << "Name: "; rt.Name();rt.Name(); cout << "\nTable: ";cout << "\nTable: "; if(rt.HasTable()) cout << "yes\n";if(rt.HasTable()) cout << "yes\n"; else cout << "no\n";else cout << "no\n";}}

TableTennisPlayer player1("Tara", "Boomdea", false);TableTennisPlayer player1("Tara", "Boomdea", false);RatedPlayer rplayer1(1140, "Mallory", "Duck", true);RatedPlayer rplayer1(1140, "Mallory", "Duck", true);Show(player1);Show(player1);Show(rplayer1);Show(rplayer1);

Implicit copy constructorImplicit copy constructorRatedPlayer sams(1100, "Sams", "Lups", true);RatedPlayer sams(1100, "Sams", "Lups", true);

// invoke implicit copy constructor and up-casting, TableT// invoke implicit copy constructor and up-casting, TableTennisPlayer(const TableTennisPlayer&);ennisPlayer(const TableTennisPlayer&);

TableTennisPlayer fakeSams1(sams);TableTennisPlayer fakeSams1(sams);

TableTennisPlayer fakeSams2 = sams;TableTennisPlayer fakeSams2 = sams;TableTennisPlayer fakeSams3;TableTennisPlayer fakeSams3;fakeSams3 = sams; fakeSams3 = sams; // assignment op and up-casting// assignment op and up-casting

Inheritance modelInheritance modelPublicPublic

Is-a relationshipIs-a relationshipIllegal relationshipsIllegal relationships

Is-like-a, has-a, is-implemented-as, uses-aIs-like-a, has-a, is-implemented-as, uses-a

PrivatePrivateProtectedProtected

BindingBindingStatic binding (early binding) Static binding (early binding) during comduring compilingpilingDynamic binding (late binding) Dynamic binding (late binding) during exduring executionecution

Type compatibility of pointer and Type compatibility of pointer and referencereferencedouble x = 3.5;double x = 3.5;int *pi = &x; int *pi = &x; // mismatch pointer types// mismatch pointer typeslong &r = x; long &r = x; // mismatch reference type// mismatch reference typeDerivedClass test;DerivedClass test;BaseClass *pd = &test; // okBaseClass *pd = &test; // okBaseClass &rd = test; // okBaseClass &rd = test; // ok

Upward & downward castingUpward & downward casting class Singer: public Employeeclass Singer: public Employee {{ public:public: void range();void range(); };};

class Employeeclass Employee {{ private:private: char name[40];char name[40]; public:public: void show_name();void show_name(); };};

Employee veep;Employee veep; Singer trala;Singer trala; Employee *pe = &trala; Employee *pe = &trala; // upward casting// upward casting Singer *ps = (Singer*)&veep; Singer *ps = (Singer*)&veep; // downward casting// downward casting pe->show_name(); pe->show_name(); // ok// ok pe->range(); pe->range(); // compile error: range() is not a member of Employee// compile error: range() is not a member of Employee ps->range(); ps->range(); // Run time error// Run time error

Upward & downward castingUpward & downward castingWhy ?Why ?

downward casting: run time error.downward casting: run time error.upward casting: compile error.upward casting: compile error.

Virtual member function & dynamiVirtual member function & dynamic bindingc binding

Virtual function uses dynamic binding, whereaVirtual function uses dynamic binding, whereas, non-virtual function employs static bindings, non-virtual function employs static binding

Derived_class dc; Derived_class dc; // derived class// derived classBase_class *bcp; Base_class *bcp; // base class// base classbcp = &dc; bcp = &dc; // Base_class pointer to Derived_class object// Base_class pointer to Derived_class objectbcp->Function(); bcp->Function(); // which version?// which version?

Virtual member function & dynamiVirtual member function & dynamic bindingc binding

ExampleExample

Brass Porky("Porcelot Pigg", 381299, 4000.00);Brass Porky("Porcelot Pigg", 381299, 4000.00);

Brass *bp; // base classBrass *bp; // base classbp = &Porky;bp = &Porky;bp->ViewAcct(); // which version?bp->ViewAcct(); // which version?

Virtual or non-virtual?Virtual or non-virtual?Virtual functionVirtual function

Base class member function Base class member function isis allowedallowed to bto be redefinede redefined in derived class in derived class

Non-virtual functionNon-virtual functionBase class member function Base class member function is is not allowednot allowed t to beo be redefined in derived class redefined in derived class

How virtual function work?How virtual function work?ExampleExample

Instrument4.cppInstrument4.cpp

How virtual function work?How virtual function work?*Virtual function table (vtbl)*Virtual function table (vtbl)

Single ObjectSingle Object

How virtual function work?How virtual function work?*Virtual function table (vtbl)*Virtual function table (vtbl)

Multiple ObjectMultiple Object

Price for using virtual functioPrice for using virtual functionn

Extra vtbl space using for every object crExtra vtbl space using for every object creationeationCompiler will create an array to store virtCompiler will create an array to store virtual function address in every classual function address in every classExtra time using in finding the function aExtra time using in finding the function addressddress

Rules for virtual functionRules for virtual functionConstructor cannot be a virtual functionConstructor cannot be a virtual functionDestructor usually be a virtual functionDestructor usually be a virtual functionFriend function cannot be a virtual functionFriend function cannot be a virtual functionStatic function cannot be a virtual functionStatic function cannot be a virtual functionFunction signature consistence in a redefinFunction signature consistence in a redefined functioned functionIf virtual functions are overloaded in base clIf virtual functions are overloaded in base class, then redefined all the functions in derivass, then redefined all the functions in derived classed class

Accessibility for protectedAccessibility for protected

Member functions in classMember functions in class

PolymorphismPolymorphismExampleExample

RoughDrawRoughDrawPracticePractice

加上 加上 RRect RRect 和 和 Ellipse Ellipse 兩個類別。兩個類別。

ReferencesReferencesThinking in C++ (Free E-Book)Thinking in C++ (Free E-Book)Beginning C++: The Complete Language Beginning C++: The Complete Language (( 中譯:中譯: C++ C++ 教學範本教學範本 ))物件導向程式設計物件導向程式設計 hhttp://vr.me.ncku.edu.tw/courses/index-ottp://vr.me.ncku.edu.tw/courses/index-oop.htmop.htm良葛格學習筆記良葛格學習筆記 httphttp://caterpillar.onlyfun.net/Gossip/index.h://caterpillar.onlyfun.net/Gossip/index.htmltml