Kelas Abstrak
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 60 dari 104.
class abstrak adalah class yang memiliki setidaknya satu fungsi virtual murni. Karena antarmukanya belum lengkap, kamu tidak dapat membuat object dari class abstrak secara langsung. Class ini hanya ada untuk diwarisi.
class Shape {
public:
virtual double area() = 0; // Virtual murni, membuat Shape menjadi class abstrak
virtual double perimeter() = 0; // Fungsi virtual murni lainnya
void printInfo() { // Method biasa, memiliki implementasi
std::cout << "Area: " << area() << std::endl;
}
virtual ~Shape() = default;
};
Shape s; // Error: class abstrak tidak dapat diinstansiasiabstract class dapat berisi campuran fungsi virtual murni (tanpa implementasi), fungsi virtual biasa (dengan implementasi default), dan fungsi nonvirtual. Ini memungkinkan kamu mendefinisikan perilaku umum sekaligus mewajibkan class turunan mengimplementasikan fungsionalitas tertentu.
class Circle : public Shape {
double radius;
public:
Circle(double r) : radius(r) {}
double area() override { return 3.14159 * radius * radius; }
double perimeter() override { return 2 * 3.14159 * radius; }
};
Circle c(5.0); // OK: Circle mengimplementasikan semua fungsi virtual murni
c.printInfo(); // Menggunakan printInfo() yang diwarisi dan memanggil area() milik CircleDerived class harus mengimplementasikan semua fungsi virtual murni agar menjadi konkret (dapat diinstansiasi). Jika masih ada yang tidak diimplementasikan, class tersebut tetap abstrak. Mekanisme ini memastikan setiap class konkret dalam hierarkimu menyediakan fungsionalitas yang diperlukan.
Tantangan
MudahMari kita buat sistem pemutar media yang menunjukkan cara class abstrak mendefinisikan kontrak untuk berbagai jenis media. Kamu akan membuat base class abstrak yang menetapkan hal-hal yang harus dilakukan setiap pemutar media, lalu mengimplementasikan pemutar konkret untuk konten audio dan video.
Kamu akan mengatur kodemu dalam tiga file:
MediaPlayer.h: Definisikan class abstrakMediaPlayersebagai cetak biru untuk semua jenis media. Class abstrakmu harus memiliki:- Anggota
std::string titleberakses protected - Anggota
int durationberakses protected (dalam satuan detik) - Konstruktor yang menginisialisasi kedua nilai tersebut
- method virtual murni
play(): setiap jenis media akan diputar dengan cara berbeda - method virtual murni
getMediaType()yang mengembalikanstd::string - method biasa (non-virtual)
showInfo()yang mencetak:<title> (<duration>s) - Type: <mediaType>. Method ini harus memanggilgetMediaType()untuk mendapatkan jenisnya - Destruktor virtual
- Anggota
Players.h: Implementasikan dua pemutar media konkret yang mewarisiMediaPlayer:AudioPlayer:- Anggota
std::string artistberakses private - Konstruktor yang menerima judul, durasi, dan artis
- Implementasikan
play()agar mencetak:Playing audio: <title> by <artist> - Implementasikan
getMediaType()agar mengembalikan"Audio"
VideoPlayer:- Anggota
std::string resolutionberakses private - Konstruktor yang menerima judul, durasi, dan resolusi
- Implementasikan
play()agar mencetak:Playing video: <title> in <resolution> - Implementasikan
getMediaType()agar mengembalikan"Video"
- Anggota
main.cpp: Baca empat input (masing-masing pada baris terpisah):- Judul trek audio
- Durasi audio (bilangan bulat)
- Judul video
- Durasi video (bilangan bulat)
Buat
AudioPlayerdengan artis"Unknown Artist"danVideoPlayerdengan resolusi"1080p". Simpan keduanya dalam array berisi pointerMediaPlayer*.Lakukan perulangan pada array dan untuk setiap pemutar, panggil
showInfo()terlebih dahulu, lalu panggilplay(). Cetak satu baris kosong di antara setiap item media. Bersihkan object yang dialokasikan secara dinamis setelah selesai.
Contohnya, dengan input Summer Vibes, 180, Nature Documentary, dan 3600:
Summer Vibes (180s) - Type: Audio
Playing audio: Summer Vibes by Unknown Artist
Nature Documentary (3600s) - Type: Video
Playing video: Nature Documentary in 1080pPerhatikan bahwa method showInfo() didefinisikan satu kali di base class abstrak, tetapi memanggil getMediaType() yang virtual murni. Ini menunjukkan cara class abstrak dapat menggabungkan implementasi konkret dengan method yang harus disediakan oleh class turunan. Ingat untuk menggunakan kata kunci override pada semua method yang dioverride.
Coba sendiri
#include <iostream>
#include <string>
#include "MediaPlayer.h"
#include "Players.h"
int main() {
// Baca input
std::string audioTitle;
int audioDuration;
std::string videoTitle;
int videoDuration;
std::getline(std::cin, audioTitle);
std::cin >> audioDuration;
std::cin.ignore();
std::getline(std::cin, videoTitle);
std::cin >> videoDuration;
// TODO: Buat AudioPlayer dengan artis "Unknown Artist"
// TODO: Buat VideoPlayer dengan resolusi "1080p"
// TODO: Simpan keduanya dalam array pointer MediaPlayer*
// TODO: Lakukan perulangan pada array dan untuk setiap pemutar:
// 1. Panggil showInfo()
// 2. Panggil play()
// 3. Cetak satu baris kosong di antara setiap item media
// TODO: Bersihkan object yang dialokasikan secara dinamis
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online