Matakuliah
Tahun
Versi
: <<Kode>>/<<Nama mtkul>>
: <<Tahun Pembuatan>>
: <<versi/revisi>>
Pertemuan 12
Polymorphism
1
Learning Outcomes
Pada akhir pertemuan ini, diharapkan mahasiswa
akan mampu :
• Mengerti konsep polymorphism pada
pemrograman C++
2
Outline Materi
•
•
•
•
•
•
Definisi polymorphism
Abstract Class
Proses Kompilasi
Early vs Late Binding
Overriding vs Overloading method
Trivial vs True Polymorphism
3
Definisi polymorphism
• Polymorphism kemampuan dari object–object yang
berbeda dalam sebuah class hirarki untuk melakukan fungsi
(behavior) unik terhadap suatu respon message
• Poly (Many) + morph (Shape) = POLYMORPHISM: banyak
bentuk (many shapes).
– Polymorphism “Single Interface, Multiple Method”
• Polymorphism adalah kemampuan class menyembunyikan
implementasi yg berbeda dalam interface yg sama
• Polymorphism memungkinkan sebuah method yang
mempunyai nama yang sama, namun aksi (tugas) yang
berbeda.
• Dengan polymorphism dimungkinkan suatu fungsi yang
implementasi detilnya belum ada (isi fungsi belum ditulis).
• Fungsi tersebut akan dibuat virtual dan class yg berisi fungsi
virtual akan menjadi abstract class / Abstract Data type.
4
Definisi polymorphism
• Polymorphism sangat berhubungan dg
konsep Inheritance
• Implementasi polymorphism dg 2 cara:
– Overloading function: penggunaan kembali
nama fungsi yang sama tapi dengan argumen
yang berbeda
– Overriding function: sebuah fungsi dalam
class turunan yang memiliki nama, return type
dan argumen function yang sama dengan
fungsi dalam class induk
5
Kasus pada Inheritance
Class Animal
Class Bird
Class Mamal
Chrip ( )
Fly( )
Class Horse
Whinny ( )
Gallop ( )
Class Pegasus
• Implementasi Fly pada Birth
tidak sama dg Fly pada
Pegasus
• Implementasi Gallop (Kuda
belari) pada Horse tidak sama
dg Gallop pada Pegasus
• Alternatif Solusinya dg merename method Gallop()
menjadi Move() pada class
Horse, dan meng-override
Move() pada object Pegasus
untuk melakukan method
Berjalan gaya burung.
• begitu juga override Move()
pada class horses agar bisa
berjalan gaya kuda.
Fly( )
Gallop ( )
6
Abstract Class
• Absract class biasanya adalah base class, dan
tidak bisa dibuat instance.
• Manfaat dari virtual functions adalah agar
virtual method table (VMT) yg menentukan
type runtime object bukan programmer dg
statements switch-nya, karena pada program yg
besar, statements switch akan sulit dimaintain.
• Virtual function di-support oleh VMT, yg
menyebabkan runtime overhead, baik dalam
ukuran maupun performance program.
• VMT bekerja pada saat runtime dg demikian
polymorphism berhubungan dg proses kompilasi 7
Program – Abstract Class
• Perhatikan urutan base class & derived
class pada kasus berikut ini:
OrgEntity
Company
Division
Departement
– OrgEntity merupakan abstact class yg berarti
tujuan utamanya hanya sebagai base class
– OrgEntity memiliki function
number_employees yg me-return jumlah
employee pada tiap unit organisasi
– ada class pada hirarki memiliki virtual function
office_party yg me-return jumlah employee
yang dianggarkan untuk acara tahunan
8
Program – Abstract Class
•
•
#include <iostream.h>
#include <string.h>
•
•
•
•
•
•
•
•
•
•
•
class OrgEntity
{ char name[25];
int employee_count;
public:
OrgEntity(char *s, int ec);
int number_employees()
{ return employee_count; }
char *org_name()
{ return name; }
virtual int office_party() = 0;
};
Pure Virtual
Method Abstract
Class OrgEntity
class Company : public OrgEntity
{ public:
Company(char *s, int ec);
virtual int office_party();
};
class Division : public Company
{ public:
Division(char *s, int ec);
virtual int office_party();
};
class Department : public Division
{ public:
Department(char *s, int ec);
int office_party();
};
9
Program – Abstract Class
Company :: Company(char *s, int ec)
{}
Virtual int Company :: office_party()
{}
Division :: Division (char *s, int ec)
{}
Virtual int Division :: office_party()
{}
Department :: Department (char *s, int ec)
{}
int Department :: office_party()
{}
void budget(OrgEntity& oe)
{
cout << "\n---- Budget Report ----\n";
cout << oe.org_name();
cout << " $" << oe.number_employees()
* oe.office_party();
cout << '\n';
}
void main()
{ Company company("Bilbo Software,
Inc.", 35);
Division div("Vertical Applications", 12);
Department dept("Medical Practice", 4);
budget(company);
budget(div);
budget(dept);
}
10
Proses Kompilasi Program
C++
.cpp
.Obj
+
.h
Polymorphism
pada C++ diproses
pada saat
eksekusi (runtime)
late binding
/dinamic binding
.exe
BINDING /
LINKING
11
Early vs Late Binding
Early Binding
C Style
Function didefinisikan
sebelum compiling
Link body function +
function header /
prototype
Trivial Polymorphism
Late Binding/Dinamic
Binding
C++ Style
Definisi function dpt
dilakukan saat runtime
Compiler membuat VMT utk
class yg mengandung
polymorphism
Jika derived class memiliki
fungsi yg sama (Overriding)
dg base class, VmT akan
menunjuk ke base-class
function
True Polymorphism
12
Early vs Late Binding
• Trivial Polymorphism
– Function Overloading nama fungsi sama
tapi tugasnya berbeda
– Dibedakan oleh 3 function signature
• True Polymorphism
– Functon Overriding fungsi yg namanya
sama tapi tidak berada dalam kelas yg sama
– Diimplementasikan dg Virtual Method
• Pure Virtual Method
• Squasi Virtual Method
13
Overriding vs Overloading
method
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Output:
20
#include<iostream.h>
class cA
{public: double A(double x)
{ return x*x;}
double B(double x)
{ return A(x)/5;}
double B(double x, double y)
{ return x/y;}
};
class cB: public cA
{public: double A(double x)
{return x*x*x;}
};
void main()
{
cB oB;
cout << oB.B(10);
}
Method B is
Overloaded
Method A is
Overrided
14
Pure VS Squasi Virtual Method
•
•
•
•
•
•
•
•
•
Pure Virtual Method hanya
mendeklarasikan function prototipes
saja (no body function) task of
function’s not defined yet.
Suatu class yang memiliki pure virtual
method abstract class.
Instance (object) tidak dapat dibuat dari
suatu abstract class, karena masih ada
fungsi yang tidak memiliki function
body.
Ciri dari pure virtual method adalah
pada deklarasi ditulis fungsi() = 0.
•
Squasi Virtual Method memiliki
fungsi minimal yang harus
dikerjakan oleh suatu method /ada
body function.
class MyClass
{ virtual void foo() { ; }
};
Nol
Statement
class MyClass
{
virtual void foo() = 0;
};
15
Virtual Destructor
• Base class pointer ke object turunan
– Jika di-destroy dengan delete, behavior tdk
terspesifikasi
• Perbaikan sederhana
– Declare base-class destructor virtual dengan
demikian ketika delete digunakan, destructor
tertentu yang dijalankan
• Ketika object class turunan di-destroy
– Destructor class turnan di-execute pertama kali,
destructor class induk di-execute kemudian
• Constructors tidak dapat dibuat virtual
16
Program – Virtual Destructor
#include <iostream.h>
#include <string.h>
class OrgEntity
{ char *name;
public:
OrgEntity(char *s);
virtual ~OrgEntity();
void org_name();
};
OrgEntity::OrgEntity(char *s)
{ name = new char[strlen(s)+1];
strcpy(name, s);
}
OrgEntity::~OrgEntity()
{ cout << "\nOrgEntity destructor";
delete[] name;
}
void OrgEntity::org_name()
{
cout << name;
}
class Division : public OrgEntity
{ char *manager;
public:
Division(char *s, char *mgr);
~Division();
};
Division::Division(char *s, char *mgr) :
OrgEntity (s)
{ manager=new char[strlen(mgr)+1] ;
strcpy(manager, mgr);
}
Division::~Division()
{ cout << "\nDivision destructor";
delete[] manager;
}
17
Program – Virtual Destructor
void main()
{
OrgEntity *orgs[3];
orgs[0] = new OrgEntity("Bilbo Software, Inc.");
orgs[1] = new Division("Vert Apps", "Ron
Herold");
orgs[2] = new Division("Horiz Apps", "Bob
Young");
for (int i = 0; i < 3; i++)
{ delete orgs[i]; }
}
18
Latihan Program#1
#include <iostream.h>
#include <string.h>
class BillingItem
{protected:
char name[25];
int cost;
public:
virtual void display() = 0;
};
class Product:public virtual BillingItem
{ int qty_sold;
public:
Product(char *nm, int qty, int cst);
void display()
{ cout << qty_sold; }
};
Product::Product(char *nm, int qty,
int cst)
{ qty_sold = qty;
strcpy(name, nm);
cost = cst;
}
class Service : public virtual
BillingItem
{ int manhours;
public:
Service(char *nm, int mh, int
cst);
void display()
{ cout << manhours; }
};
19
Latihan Program #1 (Lanj)
Service::Service(char *nm, int mh,
int cst)
{ manhours = mh;
strcpy(name, nm);
cost = cst;
}
class Installation : public Product,
public Service
{public:
Installation(char *nm, int qty, int
hrs, int cst)
: Product(nm, qty, cst),
Service(nm, hrs, cst) { }
void display();
};
void Installation::display()
{
cout << "\nInstalled ";
Product::display();
cout << ' ' << name << 's';
cout << "\nLabor: ";
Service::display();
cout << " hours";
cout << "\nCost: $" << cost;
}
void main()
{ Installation inst("refrigerator", 2,
3, 75);
inst.display();
}
20
Latihan Program #2
• Buatlah function definition untuk overloading
function pada modul main( ) berikut ini
#include <iostream.h>
void main()
{ cetak(10); // mencetak angka 10
cetak (‘A’); // mencetak huruf A
cetak (‘X’,10); // mencetak huruf X sebayak 10 kali
cetak (7,’Z’); // mencetak angka 7 dan huruf Z
}
21
Topik Minggu Depan
• Review Ujian Akhir Semester
• Tugas: Mahasiswa membuat program
sederhana yang menggambarkan konsep
Polymorphism: Sistem Elevator
Sederhana
• Tugas (Optional): Studi Kasus-An LCD
Numeric Line Editor (ref: buku-C is for
control)
22
© Copyright 2026 Paperzz