[62010948] “Inherited Class การสืบทอดคลาส”
“ อย่าพึ่งตกใจไปไอสอง !… มันไม่ได้ยากขนาดนั้น ”

“ อยากมีปืนหลายกระบอกจัง… ทำยังไงดี? ”
“ อยากมีรถหลายคัน… เขียนโปรแกรมยังไงดี? ”
“ อยากมีตัวละครหลายตัวให้เลือก… ทำยังไงดี? ”
บทความนี้จะสอนเกี่ยวกับ “การสืบทอดของคลาส”
มีประโยชน์มากๆสำหรับ การเขียนโปรแกรมขนาดใหญ่ ที่มีแม่แบบที่คล้ายคลึงกัน
เช่น …
ชนิดปืน มี… ปืนพก ปืนกล ปืนกลหนัก ปืนแม่นไกล
ชนิดยานพาหนะ (หรือ รถ) มี… รถเก๋ง รถตู้ รถบรรทุก
ชนิดตัวละคร มี… พระเอก1 พระเอก2 นางเอก1 นางเอก2
ซึ่งแต่ละ Class แม่ ก็จะมีสิ่งที่เหมือนๆกันของเหล่าคลาสลูก อย่างเช่น
คลาสแม่ ปืน มี จำนวนกระสุน/ อัตราการยิง/ รูปร่าง/ รูปทรง/ สี
คลาสแม่ ยานพาหนะ (หรือ รถ) มี ความเร็ว/ จำนวนคนนั่ง/ รูปร่าง/ รูปทรง/ สี
คลาสแม่ ตัวละคร มี เลือด / อาวุธ /รูปร่าง/ รูปทรง/ สี
เป็นต้น
อาจจะไม่ได้ทำเป็นรูปแบบของ SFML แต่เชื่อได้ว่าจะมีประโยชน์ต่อการเขียนโปรแกรมแน่นอน :)
เอาที่ง่ายที่สุด จะได้เข้าใจหลักการทำงาน
ผมจะยกตัวอย่างของ Class Vehicle (ยานพาหนะ)

จะสังเกตได้เลยว่า ทั้ง 3 Class นี้ มี Method ที่เหมือนกันเด้ะๆ เรียกได้ว่าก้อปวาง
กันเลยทีเดียว ซึ่งถามว่า เขียนแบบนี้ได้มั้ย …
แน่นอนครับ มันได้ …แต่ !
ถ้าเรารู้วิธีการเขียน Inherited Class หรือการสืบทอดของคลาส
เชื่อได้เลยว่า ความคิดแบบนี้จะเปลี่ยนไป…
เพราะการเขียนโดย ไม่ใช้ Inherited Class จะ…
- ทำให้โค้ดของเรายาวขึ้น โดยไม่มีความจำเป็นใดๆเลย (เหมือนภาพด้านบนอะ)
- ทำให้ Debug โค้ดตัวเองยากขึ้น แก้ไขลำบาก
- ทำให้ฟุ่มเฟือยพื้นที่การใช้งานการคำนวณของคอมพิวเตอร์
ลองมาดูกันดีกว่า ว่าเจ้านี่มันมีดีอะไรขนาดนั้น …

อ้าาา! เริ่มเห็นแล้วใช่มั้ย ว่ามันมีประโยชน์ยังไง
มันสามารถรวบสิ่งที่เหมือนกันเช่น method ของ Class Vehicle ที่ทุก ยานพาหนะจะมี
ได้แก่…
- FuelAmount();
- Capacity();
- applyBreaks();
แต่ ยานพาหนะทุกคัน จะมีค่าภายในที่ต่างกันอยู่ ทั้งรูปร่าง รูปทรง ค่า stat ต่างๆ
ซึ่ง การใช้ Inherited Class จะทำให้โค้ดสั้นลงมาก และ Debug ง่ายมากๆเลย…
“ แต่มันเขียนยากอะ … เขียนปกติเถอะนะ ”
ก็เพราะมันไม่ยากขนาดนั้น ถึงเลยมาเขียนบทความอยู่นี่ไง 555
Syntax Inherited Class ไม่ยากอย่างที่คิด
class subclass_name : access_mode base_class_name
{
//body of subclass
};subclass_name = ชื่อคลาสลูก
access_mode = โหมดสำหรับการสืบทอด
base_class_name = ชื่อคลาสแม่
body of subclass = เนื้อข้อมูลที่เขียนในคลาสลูก
อาจจะยังไม่เห็นภาพ ลองมาดูตัวอย่างกันเลย
// Inherited Class Example
#include <iostream>
using namespace std;
//Base class
class Parent
{
public:
int id_p;
};
// Sub class inheriting from Base Class(Parent)
class Child : public Parent
{
public:
int id_c;
};
//main function
int main()
{
Child obj1;
// An object of class child has all data members
// and member functions of class parent
obj1.id_c = 7;
obj1.id_p = 91;
cout << "Child id is " << obj1.id_c << endl;
cout << "Parent id is " << obj1.id_p << endl;
return 0;
}Output:
Child id is 7
Parent id is 91จากโค้ดด้านบนเราจะเห็นได้ว่า เราประกาศการสืบทอดเป็น : public Parent
ทำให้เราสามารถดึงทุกอย่างที่อยู่ใน Parent มาใช้ได้หมดเลย (ยกเว้น private ของ Parent)
โหมดของการสืบทอด Mode of Inheritance
class Child : public Parentมี 3 อย่างหลักๆ คือ
- public
- protected
- private
มาดูตัวอย่างการใช้งานเลยดีกว่า
//Example of Mode of Inheritance
class A
{
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A
{
// x is public
// y is protected
// z is not accessible from B
};
class C : protected A
{
// x is protected
// y is protected
// z is not accessible from C
};
class D : private A // 'private' is default for classes
{
// x is private
// y is private
// z is not accessible from D
};
โดยคอนเซปของการ Inherited Class จะเห็นได้ว่า มันไม่ยากเลย แถมยังสามารถช่วยในการเขียนโปรแกรมได้ดีขึ้นเยอะมากๆ สำหรับโปรเจคเกมที่มีขนาดสเกลที่ใหญ่
ชนิดของการ Inheritence
มีหลายชนิด ผมจะยกตัวอย่างมาหนึ่งชนิดที่ใช้บ่อยเลยก็คือ
การสืบทอดคลาสแบบเดี่ยว หรือ Single Inherited Class

ใช้บ่อยสำหรับการทำ ชนิดของรถ หรือปืน ที่มี method เหมือนกัน ต่างกันที่ property ของแต่ละชนิด
// Single inheritance
#include <iostream>
using namespace std;
// base class
class Vehicle {
public:
Vehicle()
{
cout << "This is a Vehicle" << endl;
}
};
// sub class derived from two base classes
class Car: public Vehicle{
};
// main function
int main()
{
// creating object of sub class will
// invoke the constructor of base classes
Car obj;
return 0;
}Output :
This is a vehicleหวังว่าเพื่อนๆ จะได้รับประโยชน์ ไม่มากก็น้อยสำหรับการสืบทอดคลาส
และยังมีอีกหลายชนิดของ Inheritance Class ที่ผมยังไม่ได้บอกอีกมากมาย
สามารถกดเข้าไปศึกษาเพิ่มเติมในลิ้งนี้ได้เลยย
ขอบคุณที่อ่านจนจบนะครับ :)
นาย สิรวิชญ์ สุขวัฒนาวิทย์ 62010948
