Upload
pinglun-liao
View
25
Download
5
Embed Size (px)
Citation preview
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+
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
Inheritance classInheritance classclass RatedPlayerclass RatedPlayer: public: public TableTennisPlaye TableTennisPlaye
rr{{ private:private: int rating;int rating; public:public: ......};};
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
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?*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
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