Polymorphism and Inheritance

Polymorphism

Polymorphism หมายถึง การมีหลายรูปแบบ หรือก็คือ ใน 1 กระบวนการหรือการกระทำสามารถแสดงผลลัพธ์หรือแสดงผลการกระทำได้มากกว่าหนึ่งรูปแบบ แบ่งออกเป็น 2 ประเภท

1. Function Overloading

การใช้ชื่อฟังก์ชันเหมือนกัน แต่มีความสามารถหรือคุณลักษณะที่แตกต่างกัน หมายความว่า ฟังก์ชันสามารถเปลี่ยนจำนวการรับพารามิเตอร์หรือเปลี่ยนประเภทตัวแปรของพารามิเตอร์

// oop_p3_1.cpp
#include <iostream>
using namespace std;

class function_overlasding 
{ 
    public: 
      
    // function with 1 int parameter 
    int func(int x) { 
        return x + 5; 
    } 
      
    // function with same name but 1 double parameter 
    void func(double x) { 
        cout << "value of x is " << x << endl; 
    } 
      
    // function with same name and 2 int parameters 
    void func(int x, double y) { 
        cout << "value of x and y is " << x << ", " << y << endl; 
    } 
}; 
  
int main() { 
      
    function_overlasding obj1; 
      
    // Which function is called will depend on the parameters passed 
    // The first 'func' is called  
    int a = obj1.func(7);
    cout << a  << endl; 
      
    // The second 'func' is called 
    obj1.func(9.132); 
      
    // The third 'func' is called 
    obj1.func(85,9.132); 
    return 0; 
}  
12
value of x is 9.132
value of x and y is 85, 9.132

จากตัวอย่างจะเห็นได้ว่าฟังก์ชันที่ชื่อ func ทำหน้าที่แตกต่างกันใน 3 สถานการณ์ (การรับพารามิเตอร์) ที่แตกต่างกัน ซึ่งเป็นคุณสมบัติของ Polymorphism

2. Operator Overloading

operator ที่ทำงานได้หลายแบบ ในหลักการเชิงวัตถุจะช่วยให้สามารถเรียกใช้เครื่องหมายเช่น +, -, *, / แทนการเรียกใช้เมดธอดหรือฟังก์ชันของ object

// oop_p3_2.cpp
#include <iostream>
using namespace std;
   
class Complex { 
    private: 
        int real, imag; 
    public: 
        // first section code
        Complex(int r = 0, int i =0) {
            real = r;   imag = i;
        } 
        
        // second section code
        // This is automatically called when '+' is used with 
        // between two Complex objects 
        Complex operator + (Complex const &obj) { 
            Complex res; 
            res.real = real + obj.real; 
            res.imag = imag + obj.imag; 
            return res; 
        } 
        void print() { 
            cout << real << " + i" << imag << endl; 
        } 
}; 
   
int main() 
{ 
    Complex c1(10, 5), c2(2, 4); 
    Complex c3 = c1 + c2; // An example call to "operator+" 
    c3.print(); 
} 
12 + i9

ตัวอย่างให้ศึกษาเพิ่มเติม :: การ overload operator ใน C++

Inheritance

Inheritance คือ การสืบทอดความสามารถของ class ในการรับคุณสมบัติและลักษณะจาก class อื่น

ศัพย์ที่ควรรู้ ::

Sub Class คือ คลาสที่สืบทอดคุณสมบัติจากคลาสอื่น เรียกว่า คลาสที่ได้รับ (Derived Class)

Super Class คือ คลาสที่มีคุณสมบัติสืบทอดหรือที่รู้จักกันว่าเป็นคลาสตั้งต้น (Base Class)

จากภาพ หมายความว่า Animal class ถือว่าเป็น Base Class ส่วน dog class, Cat class และ Cow class จะเป็นเพียง Derived Class ของ Animal class ซึ่งการสืบทอดความสามารถจะมีหลายแบบ แต่ในหัวข้อนี้จะกล่าวถึงเพียงแค่ 3 แบบ คือ การสืบทอดทางเดียว (Single Inheritance) การสืบทอดหลายรายการ (Multiple Inheritance) และการสืบทอดหลายนะดับ (Multilevel Inheritance)

1. Single Inheritance

การสืบทอดทางเดียว หมายความว่า 1 Derived Class สามารถรับการสืบทอดได้ 1 Base Class เท่านั้น

// oop_p3_3.cpp
#include <iostream>
#include <string>
using namespace std;

// Base class
class Vehicle {
  public: 
    string brand = "Ford";
    void honk() {
      cout << "Tuut, tuut! \n" ;
    }
};

// Derived class
class Car: public Vehicle {
  public: 
    string model = "Mustang";
};

int main() {
  Car myCar;
  myCar.honk();
  cout << myCar.brand + " " + myCar.model << endl;
  return 0;
}
Tuut, tuut! 
Ford Mustang

2. Multiple Inheritance

การสืบทอดหลายหลายการ หมายความว่าใน 1 Derived Class สามารถสืบทอดได้มากว่า 1 Base Class

// oop_p3_4.cpp
#include <iostream> 
using namespace std; 
  
// first base class 
class Vehicle { 
  public: 
    Vehicle() 
    { 
      cout << "This is a Vehicle" << endl; 
    } 
}; 
  
// second base class 
class FourWheeler { 
  public: 
    FourWheeler() 
    { 
      cout << "This is a 4 wheeler Vehicle" << endl; 
    } 
}; 
  
// sub class derived from two base classes 
class Car: public Vehicle, public FourWheeler { 
  
}; 
  
// main function 
int main() 
{    
    // creating object of sub class will 
    // invoke the constructor of base classes 
    Car obj; 
    return 0; 
} 
This is a Vehicle
This is a 4 wheeler Vehicle

3. Multilevel Inheritance

การสืบทอดหลายนะดับ หมายความว่า Derived Class สามารถรับการสืบทอด Base Class ที่สืบทอดกันมาก่อนได้

จากภาพจะเห็นได้ว่า Class C จะเป็น Base Class หลักของการสืบทอด ส่วน Class B จะเป็นทั้ง Derived Class ของ Class C และเป็น Base Class ของ Class A อีกทีหนึ่ง ทำให้ Class A ที่เป็น Derived Class สุดท้ายสามารถสืบทอดได้ทั้งคุณสมบัติของ Class B และ Class C

// oop_p3_5.cpp
#include <iostream> 
using namespace std; 
  
// base class 
class Vehicle  
{ 
  public: 
    Vehicle() 
    { 
      cout << "This is a Vehicle" << endl; 
    } 
}; 
class fourWheeler: public Vehicle 
{  public: 
    fourWheeler() 
    { 
      cout<<"Objects with 4 wheels are vehicles"<<endl; 
    } 
}; 
// sub class derived from two base classes 
class Car: public fourWheeler{ 
   public: 
     Car() 
     { 
       cout<<"Car has 4 Wheels"<<endl; 
     } 
}; 
  
// main function 
int main() 
{    
    //creating object of sub class will 
    //invoke the constructor of base classes 
    Car obj; 
    return 0; 
} 
This is a Vehicle
Objects with 4 wheels are vehicles
Car has 4 Wheels

ตัวอย่างให้ศึกษาเพิ่มเติม :: Inheritance in C++

Access Specifiers for Inheritance

อย่างที่ทราบกันว่า Access Specifiers จะมีทั้งหมด 3 แบบ คือ public, private และสุดท้ายคือ protected ที่จะกล่าวถึงในหัวข้อนี้ ซึ่ง protected จะเป็นการอนุญาติการเข้าถึงข้อมูลเฉพาะ class ที่เป็น Derived class เท่านั้น

ถึงแม้ว่าใน Inheritance จะเป็นการสืบทอดความสามารถของ class แต่ไม่สามารถสืบทอดความสามารถที่ถูกจำกัดการเข้าถึงแบบ private ที่อยู่ใน Base class หมายความว่า ไม่สามารถสร้างเมดธอดหรือฟังก์ชันที่จะเข้าถึงข้อมูลที่เป็น private ของ Base class เนื่องจากเมดธอดหรือฟังก์ชันที่สร้างอยู่นอก class ที่มีข้อมูลที่ถูกกำหนดเป็น private

// oop_p3_6.cpp
#include <iostream>
using namespace std;

// Base class
class Employee  {
  protected:  // Protected access specifier
    int salary;
};

// Derived class
class Programmer: public Employee {
  public:
    int bonus;
    void setSalary(int s) {
      salary = s;
    }
    int getSalary() {
      return salary;
    }
};

int main() {
  Programmer myObj;
  myObj.setSalary(50000);
  myObj.bonus = 15000;
  cout << "Salary: " << myObj.getSalary() << "\n";
  cout << "Bonus: " << myObj.bonus << "\n";
  return 0;
}
Salary: 50000
Bonus: 15000

แหล่งอ้างอิง ::

คำถาม สามารถนำ Polymorphism มาใช้กับ Inheritance ได้หรือไม่

คำตอบ สามารถทำได้

// oop_p3_8.cpp
#include <iostream> 
using namespace std; 

// Base class
class Animal {
  public:
    void animalSound() {
    cout << "The animal makes a sound \n" ;
  }
};

// Derived class
class Pig : public Animal {
  public:
    void animalSound() {
    cout << "The pig says: wee wee \n" ;
   }
};

// Derived class
class Dog : public Animal {
  public:
    void animalSound() {
    cout << "The dog says: bow wow \n" ;
  }
};

int main() {
  Animal myAnimal;
  Pig myPig;
  Dog myDog;

  myAnimal.animalSound();
  myPig.animalSound();
  myDog.animalSound();
  return 0;
}
The animal makes a sound 
The pig says: wee wee 
The dog says: bow wow 

จากตัวอย่างจะเห็นได้ว่าสามารถใช้ชื่อฟังก์ชันหรือเมดธอดซ้ำกันได้ตามหลักการของ Polymorphism แต่จะการที่จะแสดงผลลัพธ์ที่แตกต่างกันต้องให้ object ประกาศเรียกใช้ class เพื่อเข้าถึงฟังก์ชันหรือเมดธอดที่มีผลลัพธ์ตามที่ต้องการ

Last updated

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University