Matakuliah
Tahun
Versi
: T0044/Pemrograman Berorientasi Obyek
: 2005
: 1.0
Pertemuan 11
Polymorphism
1
Learning Outcomes
Pada akhir pertemuan ini, diharapkan mahasiswa
akan mampu :
• Menghasilkan program C++ dengan
konsep Polymorphism
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;
};
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();
};
Pure Virtual
Method Abstract
Class OrgEntity
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
o Pure Virtual Method
o Squasi Virtual Method
13
Overriding vs Overloading method
#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);
}
Output:
20
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.
class MyClass
{
virtual void foo() = 0;
};
•
Squasi Virtual Method memiliki
fungsi minimal yang harus
dikerjakan oleh suatu method /ada
body function.
class MyClass
{ virtual void foo() { ; }
};
Nol
Statement
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
Tugas 11
• Tugas 11A: Mahasiswa membuat
ringkasan tentang konsep Polymorphism
• Tugas 11B: Mahasiswa mencari output
dari program Polymorphism
• Tugas 11C: Mahasiswa membuat program
sederhana yang menggambarkan konsep
Polymorphism
22
© Copyright 2026 Paperzz