inheritance ´éÇ c++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 inheritance 3 polymorphism...

45
Inheritance C++ Inheritance C++ 1 / 45

Upload: others

Post on 19-Aug-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance ด้วย C++

เทพพิทักษ์ การุญบุญญานันท์

เทพพิทักษ์ Inheritance ด้วย C++ 1 / 45

Page 2: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

เกริ่นนำ

กุญแจหลักของ OOP คือ abstraction ซึ่งประกอบด้วยแนวคิด 3ประการ

1 Encapsulation2 Inheritance3 Polymorphism

เทพพิทักษ์ Inheritance ด้วย C++ 2 / 45

Page 3: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Object-Oriented vs. Object-Based

Encapsulation สร้างออบเจกต์ที่มีทั้งข้อมูลและการกระทำครบในตัว

ภาษาที่เป็น Object-Based จะรองรับเพียง encapsulation เท่านั้น(JavaScript, Visual Basic รุ่นแรก ๆ)

ภาษาที่เป็น Object-Oriented จะครอบคลุมทั้ง encapsulation,inheritance และ polymorphism(C++, Java, Objective-C, C#, Python, Ruby, Visual Basic .NET)

Inheritance ถือเป็นแนวคิดที่นำเข้าสู่โลกของ OOP อย่างแท้จริง

เทพพิทักษ์ Inheritance ด้วย C++ 3 / 45

Page 4: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

กรณีตัวอย่าง

พนักงานโรงงาน1 พนักงานประจำ (staff)ชื่อ, เลขประจำตัวประชาชน, อายุ, เงินเดือน, วันเข้าทำงานวันแรก, รายการวันลา

2 ลูกจ้างรายวัน (temporary worker)ชื่อ, เลขประจำตัวประชาชน, อายุ, ค่าตอบแทน, รายการวันเข้าทำงาน

เทพพิทักษ์ Inheritance ด้วย C++ 4 / 45

Page 5: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

กรณีตัวอย่าง

class Staff {

public:// common info

const char* name();const char* citizenID();int age();

// staff specific

int salary();Date entryDate();DateList leaveDates();

};

เทพพิทักษ์ Inheritance ด้วย C++ 5 / 45

Page 6: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

กรณีตัวอย่าง

class TempWorker {

public:// common info

const char* name();const char* citizenID();int age();

// temporary worker specific

int wage();DateList workDates();

};

เทพพิทักษ์ Inheritance ด้วย C++ 6 / 45

Page 7: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

กรณีตัวอย่าง

ข้อสังเกตมีงานซ้ำซ้อนในส่วน common info ในคลาสต่าง ๆจะเกิดอะไรขึ้นถ้ามีข้อมูลช่องใหม่ของพนักงาน (เช่น เพศ, การศึกษา)?

จะเกิดอะไรขึ้นถ้ามีพนักงานชนิดที่สาม (เช่น พนักงาน contract)?จะเกิดอะไรขึ้นถ้าต้องการแยกประเภทพนักงานประจำ(เช่น พนักงานระดับบริหาร, พนักงานระดับปฏิบัติการ)?

→ วิธีนี้ไม่ scale!

เทพพิทักษ์ Inheritance ด้วย C++ 7 / 45

Page 8: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance

Inheritance (การสืบทอดคุณสมบัติ)

กลไกการจัดแจงส่วนที่คล้ายกันระหว่างคลาสต่าง ๆโดยจัดลำดับชั้นของคลาสเป็นคลาสทั่วไปและคลาสเฉพาะ

implement ส่วนที่ใช้ร่วมกันเพียงครั้งเดียว — ใน base classต่อเติมเป็นกรณีเฉพาะเพิ่มได้ตามต้องการ — ใน derived classเป็นลำดับชั้นของความสัมพันธ์แบบ “is-a” หรือ“generalization/specialization” คล้ายอนุกรมวิธาน (taxonomy)

เทพพิทักษ์ Inheritance ด้วย C++ 8 / 45

Page 9: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

คำศัพท์

คำศัพท์ base class / derived class ในตำราต่าง ๆsuperclass / subclass

superclass เป็นชนิดทั่วไป, subclass เป็นชนิดย่อยparent class / child class

parent class เป็นชนิดตั้งต้น, child class เป็นชนิดที่เกิดจาก parent

ในที่นี้จะใช้คำว่า base class / derived class

เทพพิทักษ์ Inheritance ด้วย C++ 9 / 45

Page 10: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ตัวอย่างแนวคิด Inheritance

Lifeเผาผลาญอาหาร

Plant

สังเคราะห์แสงAnimal

เคลื่อนที่

Protist. . .

Fungi. . .

Bacteria. . .

อนุกรมวิธานของสิ่งมีชีวิตการเข้าใจปฏิกิริยาการเผาผลาญอาหาร ทำให้เข้าใจการสร้างพลังงานของสิ่งมีชีวิตทุกชนิดการเข้าใจปฏิกิริยาสังเคราะห์แสง ทำให้เข้าใจการสร้างอาหารของพืชทุกชนิด

เทพพิทักษ์ Inheritance ด้วย C++ 10 / 45

Page 11: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ตัวอย่างแนวคิด Inheritance

MusicalInstrument

ดีด สี ตี เป่า

การจำแนกเครื่องดนตรีเครื่องดนตรีทุกชนิดทำให้เกิดเสียงกีตาร์, พิณ, ซึง, จะเข้ ใช้ทักษะการดีดและกดสายคล้ายกันไวโอลิน, ซอ, สะล้อ ใช้ทักษะการสีและกดสายคล้ายกันระนาด, กลอง, ฉิ่ง, ฉาบ ใช้การกระทบของอุปกรณ์คล้ายกันขลุ่ย, ปี่, ฟลุต ใช้ทักษะการปิดเปิดรูบนท่อคล้ายกัน

เทพพิทักษ์ Inheritance ด้วย C++ 11 / 45

Page 12: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

Employeename()citizenID()age()

Staffsalary()entryDate()leaveDates()

TempWorkerwage()workDates()

เทพพิทักษ์ Inheritance ด้วย C++ 12 / 45

Page 13: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

class Employee {

public:const char* name();const char* citizenID();int age();

};

เทพพิทักษ์ Inheritance ด้วย C++ 13 / 45

Page 14: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

class Staff : public Employee {

public:int salary();Date entryDate();DateList leaveDates();

};

class TempWorker : public Employee {

public:int wage();DateList workDates();

};

เทพพิทักษ์ Inheritance ด้วย C++ 14 / 45

Page 15: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

ผล → ออบเจกต์ชนิด Staff และ TempWorker จะสืบทอดคุณสมบัติของ Employee มาทุกประการพร้อมกับมีคุณสมบัติเพิ่มเติมของตัวเอง

int main(){

Staff s;cout << s.name() << ": " << s.salary() << endl;

TempWorker t;cout << t.name() << ": " << t.wage() << endl;

return 0;

}

เทพพิทักษ์ Inheritance ด้วย C++ 15 / 45

Page 16: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

ผล → ออบเจกต์ชนิด Staff และ TempWorker จะสามารถเป็นออบเจกต์ชนิด Employee ได้

void greet (Employee *e) { cout << "Hi, " << e->name(); }

int main(){

Staff s;greet (&s);

TempWorker t;greet (&t);

return 0;

}เทพพิทักษ์ Inheritance ด้วย C++ 16 / 45

Page 17: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Inheritance กับกรณีตัวอย่าง

แต่ในทางกลับกันไม่ได้(Staff ทุกคนเป็น Employee แต่ Employee ไม่จำเป็นต้องเป็นStaff ทุกคน)

void greet (Staff *s) { cout << "Hi, " << s->name(); }

int main(){

Employee e;greet (&e); // error!

TempWorker t;greet ((Employee *)&t); // error!

return 0;

}เทพพิทักษ์ Inheritance ด้วย C++ 17 / 45

Page 18: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ความยืดหยุ่นที่ได้

งานส่วน common info รวมอยู่ในคลาส Employee ที่เดียว

จะเกิดอะไรขึ้นถ้ามีข้อมูลช่องใหม่ของพนักงาน (เช่น เพศ, การศึกษา)?→ เพิ่มใน Employee แห่งเดียวจะเกิดอะไรขึ้นถ้ามีพนักงานชนิดที่สาม (เช่น พนักงาน contract)?→ สร้างคลาส ContractedEmployee โดยสืบทอดจากคลาสEmployee

จะเกิดอะไรขึ้นถ้าต้องการแยกประเภทพนักงานประจำ(เช่น พนักงานระดับบริหาร, พนักงานระดับปฏิบัติการ)?→ สร้างคลาส ExecutiveStaff และ OperationStaff โดยสืบทอดจากคลาส Staff

เทพพิทักษ์ Inheritance ด้วย C++ 18 / 45

Page 19: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

UML Notation

UML (Unified Modelling Language)รูปแบบการเขียน diagram สำหรับการออกแบบซอฟต์แวร์แบบObject-Oriented โดยไม่อิงกับภาษาที่ใช้เขียนโปรแกรมประกอบด้วย diagram หลายชุด เพื่อบรรยายแง่มุมต่าง ๆ ของซอฟต์แวร์ เช่น

class diagramobject diagramcomponent diagrampackage diagram

sequence diagramstate diagramuse case diagram. . .

ในที่นี้จะสนใจเพียง class diagram เพื่อประโยชน์ในการแสดงโครงสร้าง

เทพพิทักษ์ Inheritance ด้วย C++ 19 / 45

Page 20: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

UML Class Diagram

Employeename : StringcitizenID : Stringage : intprint()

ส่วนประกอบของคลาสชื่อคลาสattributeoperation

เทพพิทักษ์ Inheritance ด้วย C++ 20 / 45

Page 21: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

UML Class Diagram

Employee+ name : String- nameLen : int+ citizenID : String+ age : int+ print()

visibility ของ attribute และ operation+ public# protected- private

เทพพิทักษ์ Inheritance ด้วย C++ 21 / 45

Page 22: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

UML Class Diagram

Employee+ name : String+ citizenID : String+ age : int+ print()

Staff+ salary : int+ entryDate : Date+ leaveDates : DateList

Inheritanceใช้เส้นทึบ หัวลูกศรสามเหลี่ยมกลวง(เส้นและหัวลูกศรแบบอื่นมีความหมายอื่น)

โยงลูกศรชี้จาก derived class ไปยังbase classทิศทางของลูกศรแทนทิศของdependency(derived class ต้องอาศัย base class ในการนิยามตัวเอง)

เทพพิทักษ์ Inheritance ด้วย C++ 22 / 45

Page 23: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

UML Class Diagram

ตัวอย่างความสัมพันธ์แบบอื่น

ATMTransaction BankAccountaccount Association

Car Wheelwheels

4Aggregation

Company Departmentdepartments

1..*Composition

Order OrderDialog«instantiate» Dependency

เทพพิทักษ์ Inheritance ด้วย C++ 23 / 45

Page 24: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

การ Derive Class ใน C++

class Base {

public:int pubData;

private:int privData;

};

class Derived : public Base {

// ...

};

การเข้าถึง ผู้ใช้คลาส Derived ตัวคลาส Derived เองBase::pubData ได้ ได้Base::privData ไม่ได้ ไม่ได้

เทพพิทักษ์ Inheritance ด้วย C++ 24 / 45

Page 25: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Protected Member

สมาชิกที่เป็น protected ใน base class:ตัว derived class ทั้งหลายสามารถเข้าถึงได้ผู้ใช้ภายนอกไมส่ามารถเข้าถึงได้

เทพพิทักษ์ Inheritance ด้วย C++ 25 / 45

Page 26: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Protected Member

class Base {

public:int pubData;

protected:int protData;

private:int privData;

};

class Derived : public Base {

// ...

};

การเข้าถึง ผู้ใช้คลาส Derived ตัวคลาส Derived เองBase::pubData ได้ ได้Base::protData ไม่ได้ ได้Base::privData ไม่ได้ ไม่ได้

เทพพิทักษ์ Inheritance ด้วย C++ 26 / 45

Page 27: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Private & Protected Inheritance

class Derived : public Base {

// ...

};

access specifier ขณะประกาศ inheritance:ประกาศให้สิทธิ์ผู้ใช้ derived class ในการเข้าถึงสมาชิกของ base classไม่เกิน access specifier ที่กำหนด

member accessibilityaccess specifier ใน base class

public protected privatepublic inheritance public protected privateprotected interitance protected protected privateprivate inheritance private private private

เทพพิทักษ์ Inheritance ด้วย C++ 27 / 45

Page 28: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Private & Protected Inheritance

class Base {

public:int pubData;

protected:int protData;

private:int privData;

};

class Derived : private Base {

// ...

};

การเข้าถึง ผู้ใช้คลาส Derived ตัวคลาส Derived เองBase::pubData ไม่ได้ ได้Base::protData ไม่ได้ ได้Base::privData ไม่ได้ ไม่ได้

เทพพิทักษ์ Inheritance ด้วย C++ 28 / 45

Page 29: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Private & Protected Inheritance

class Base {

public:int pubData;

protected:int protData;

private:int privData;

};

class Derived : protected Base {

// ...

};

การเข้าถึง ผู้ใช้คลาส Derived ตัวคลาส Derived เองBase::pubData ไม่ได้ ได้Base::protData ไม่ได้ ได้Base::privData ไม่ได้ ไม่ได้

เทพพิทักษ์ Inheritance ด้วย C++ 29 / 45

Page 30: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Private & Protected Inheritance

ข้อสังเกต Private & Protected Inheritance:accessibility สำหรับผู้ใช้คลาส Derived ไม่ต่างกันความแตกต่างอยู่ที่สิทธิ์ของคลาสที่ inherit จาก Derived อีกทอด

class Derived2 : public Derived {

// ...

};

protected inheritance:คลาส Derived2 จะยังคงสามารถเข้าถึง Base::pubData และBase::protData ได้

private inheritance:คลาส Derived2 จะไม่สามารถเข้าถึง Base::pubData และBase::protData ได้

เทพพิทักษ์ Inheritance ด้วย C++ 30 / 45

Page 31: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Private & Protected Inheritance

inheritance ส่วนใหญ่ในโปรแกรมต่าง ๆ จะเป็น public inheritanceprivate & protected inheritance ใช้ในบางกรณีที่ต้องการซ่อนรายละเอียดของ implementation จากผู้ใช้เท่านั้น

เทพพิทักษ์ Inheritance ด้วย C++ 31 / 45

Page 32: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

การเข้าถึงสมาชิกของ Base Class

member function ของ derived class สามารถเข้าถึง member ที่เป็นpublic และ protected ของ base class ได้เหมือนเป็น member ของตัวเอง:

class Staff : public Employee {

// ...

public:void print() const;

};

void Staff::print() const{

// Calling Employee::name() and Staff::salary()

cout << name() << ": " << salary() << endl;}

เทพพิทักษ์ Inheritance ด้วย C++ 32 / 45

Page 33: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

การ Override Base Class

derived class สามารถกำหนด member function ทับของ base class ได้

class Employee {

// ...

public:void print() const;

};

class Staff : public Employee {

// ...

public:void print() const;

};

Employee e;// Employee::print()

e.print();

Staff s;// Staff::print()

s.print();

เทพพิทักษ์ Inheritance ด้วย C++ 33 / 45

Page 34: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

การ Override Base Class

ในฟังก์ชันของ derived class อาจเรียกฟังก์ชันของ base class ได้

void Staff::print(){

Employee::print();

cout << ": " << salary();}

เทพพิทักษ์ Inheritance ด้วย C++ 34 / 45

Page 35: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Constructor & Destructor

ถ้า base class มี constructor ที่รับอาร์กิวเมนต์constructor ของ derived class ก็สามารถเรียกใน initialization list ได้

class Employee {

public:Employee (const char* name, const char* id, int age);// ...

};

class Staff : public Employee {

public:Staff (const char* name, const char* id, int age,

int salary): Employee (name, id, age), salary (salary) {}

};

เทพพิทักษ์ Inheritance ด้วย C++ 35 / 45

Page 36: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Constructor & Destructor

ขั้นตอนการ construct ออบเจกต์: จากล่างขึ้นบน1 เรียก constructor ของ base class2 เรียก constructor ของ member ต่าง ๆ ตามลำดับการประกาศ3 เรียก constructor ของตัว derived class เอง

ขั้นตอนการ destruct ออบเจกต์: ย้อนคืน คือจากบนลงล่าง1 เรียก destructor ของตัว derived class เอง2 เรียก destructor ของ member ต่าง ๆ ย้อนลำดับการประกาศ3 เรียก destructor ของ base class

เทพพิทักษ์ Inheritance ด้วย C++ 36 / 45

Page 37: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Class Hierarchy

derived class สามารถเป็น base class ให้กับคลาสอื่นได้อีก→ กลายเป็น “class hierarchy”

Box

Button ScrolledBox

ClickButton RadioButton TextEntry ListBox

เทพพิทักษ์ Inheritance ด้วย C++ 37 / 45

Page 38: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Multiple Inheritance

คลาสในภาษา C++ สามารถ inherit จาก base class มากกว่าหนึ่งคลาสได้→ เรียกว่า “multiple inheritance”

Assetvalue()

VehiclefuelType()

Car

class Car : public Asset, public Vehicle {

// ...

};

เทพพิทักษ์ Inheritance ด้วย C++ 38 / 45

Page 39: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Multiple Inheritance

ผล:ออบเจกต์ชนิด Car สืบทอด method มาจากทั้ง Asset และ Vehicle

Car c;int val = c.value(); // Asset::value()

Fuel fuel = c.fuelType(); // Vehicle::fuelType()

พอยน์เตอร์ Car* สามารถใช้เป็นพอยน์เตอร์ Asset* และVehicle* ได้

Car c;Asset* pA = &c;Vehicle* pV = &c;

เทพพิทักษ์ Inheritance ด้วย C++ 39 / 45

Page 40: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ข้อควรระวังในการใช้ Multiple Inheritance

เมื่อชื่อสมาชิกของ base class ชนกัน

class Asset {

// ...

protected:DebugInfo* getDebug();

};

class Vehicle {

// ...

protected:DebugInfo* getDebug();

};

void f (Car* c){

// error: ambiguous!

DebugInfo* db = c->getDebug();// ok

db = c->Asset::getDebug();// ok

db = c->Vehicle::getDebug();}

เทพพิทักษ์ Inheritance ด้วย C++ 40 / 45

Page 41: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ข้อควรระวังในการใช้ Multiple Inheritance

เมื่อ base class มีบรรพบุรุษเหมือนกันLink

next()

Assetvalue()

Linknext()

VehiclefuelType()

Car

เทพพิทักษ์ Inheritance ด้วย C++ 41 / 45

Page 42: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

ข้อควรระวังในการใช้ Multiple Inheritance

เมื่อ base class มีบรรพบุรุษเหมือนกัน

void f (Car* c){

Link* next = 0;

next = c->next(); // error, which Link?

next = c->Link::next(); // error, which Link?

next = c->Asset::Link::next(); // ok

next = c->Vehicle::Link::next(); // ok

}

เทพพิทักษ์ Inheritance ด้วย C++ 42 / 45

Page 43: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Virtual Base Class

เมื่อ base class มีบรรพบุรุษเหมือนกัน สามารถทำให้เหลือชุดเดียวได้

Linknext()

Assetvalue()

VehiclefuelType()

Car

เทพพิทักษ์ Inheritance ด้วย C++ 43 / 45

Page 44: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Virtual Base Class

วิธีการ: ใช้ keyword virtual ในการ derive class

class Asset : public virtual Link {

// ...

};

class Vehicle : public virtual Link {

// ...

};

class Car : public Asset, public Vehicle {

// ...

};

เทพพิทักษ์ Inheritance ด้วย C++ 44 / 45

Page 45: Inheritance ´éÇ C++thep/docs/cplusplus/05-c++-inheritance.pdf · 2 Inheritance 3 Polymorphism à•¾¾Ô•Ñ¡Éì Inheritance ·Ø˙´ C++ 2 / 45. ... à•¾¾Ô•Ñ¡Éì

Virtual Base Class

ผล:ออบเจกต์ชนิด Car จะมีข้อมูลของ Link เพียงชุดเดียวไม่เกิดความกำกวมในการเรียก member ของ Link

void f (Car* c){

Link* next = c->next(); // ok

}

เทพพิทักษ์ Inheritance ด้วย C++ 45 / 45