Virtual vs Abstrak
Virtual dan Abstrak adalah dua kata kunci yang digunakan di sebagian besar bahasa pemrograman Berorientasi Objek (OO) seperti Java dan C. Meskipun ada sedikit perbedaan dalam arti dalam bahasa yang berbeda, kata kunci Virtual dan Abstrak memberikan kesan implementasi parsial pada entitas yang dilampirkannya.
Abstrak
Biasanya, kelas Abstrak, juga dikenal sebagai Kelas Dasar Abstrak (ABC), tidak dapat dipakai (instance dari kelas tersebut tidak dapat dibuat). Jadi, kelas Abstrak hanya bermakna jika bahasa pemrograman mendukung pewarisan (kemampuan untuk membuat subkelas dari perluasan kelas). Kelas abstrak biasanya mewakili konsep atau entitas abstrak dengan sebagian atau tanpa implementasi. Oleh karena itu, kelas Abstrak bertindak sebagai kelas induk dari mana kelas anak diturunkan, sehingga kelas anak akan berbagi fitur yang tidak lengkap dari kelas induk dan fungsionalitas dapat ditambahkan untuk melengkapinya. Kelas abstrak mungkin berisi metode Abstrak. Subkelas yang memperluas kelas abstrak dapat mengimplementasikan metode Abstrak (diwarisi) ini. Jika kelas anak mengimplementasikan semua metode Abstrak seperti itu, itu adalah kelas konkret. Tetapi jika tidak, kelas anak juga menjadi kelas Abstrak. Apa artinya semua ini adalah bahwa, ketika programmer menominasikan sebuah kelas sebagai Abstrak, dia mengatakan bahwa kelas tersebut tidak akan lengkap dan akan memiliki elemen yang perlu diselesaikan oleh subkelas yang mewarisi. Ini adalah cara yang bagus untuk membuat kontrak antara dua programmer, yang menyederhanakan tugas dalam pengembangan perangkat lunak. Pemrogram, yang menulis kode untuk diwarisi, harus mengikuti definisi metode dengan tepat (tetapi tentu saja dapat memiliki implementasinya sendiri). Di Java dan C, kelas dan metode Abstrak dideklarasikan menggunakan kata kunci Abstrak.
Virtual
Metode/fungsi virtual memberikan kemampuan untuk secara opsional menimpa perilakunya oleh kelas yang mewarisi (menggunakan fungsi dengan tanda tangan yang sama). Konsep fungsi Virtual penting dalam skenario berikut. Misalkan sebuah kelas diturunkan oleh kelas anak, maka setiap kali objek dari kelas turunan digunakan, itu dapat merujuk ke objek kelas dasar atau kelas turunan. Tapi, perilaku pemanggilan metode bisa menjadi ambigu jika metode kelas dasar diganti. Jadi, untuk mengatasi ambiguitas ini, kata kunci virtual digunakan. Jika metode ditandai Virtual, maka fungsi kelas turunan dipanggil (jika ada) atau fungsi kelas dasar dipanggil. Misalnya, dalam C++, kata kunci virtual digunakan persis untuk tujuan ini. Di C, kata kunci Virtual digunakan dengan cara yang sama, tetapi sebagai tambahan, penggantian kata kunci harus digunakan untuk memodifikasi semua metode yang diganti. Tetapi di Java, tidak ada kata kunci Virtual yang eksplisit. Semua metode non-statis dianggap Virtual. Fungsi virtual tanpa tubuh disebut fungsi Virtual Murni. Di Java dan C, metode Abstrak sebenarnya adalah Virtual Murni.
Perbedaan Virtual dan Abstrak
Meskipun Abstrak dan Virtual adalah dua kata kunci/konsep yang memberikan arti implementasi yang tidak lengkap ke entitas terkait, keduanya memiliki perbedaan. Metode abstrak (yang harus didefinisikan di dalam kelas Abstrak) tidak memiliki implementasi sama sekali, sedangkan metode Virtual mungkin memiliki implementasi. Jika metode Abstrak diperluas oleh kelas konkret, semua metode Abstrak yang diwarisi harus diimplementasikan, sedangkan metode Virtual yang diwarisi mungkin atau tidak dapat diganti.