Warisan virtual adalah jenis warisan di mana implementasi superclass tidak lengkap, dan subclass diperlukan untuk definisi objek yang lengkap. Jenis pewarisan ini dapat digunakan bersama dengan pewarisan tunggal dan ganda, tetapi paling sering digunakan dalam pewarisan berganda. Setiap kelas yang mewarisi dari kelas dasar virtual menjadi subkelas langsung dari kelas dasar itu. Kelas dasar virtual dapat mengandalkan subkelas untuk mengimplementasikan semua metodenya, tetapi ini bukan persyaratan.
C++ adalah bahasa komputer yang paling umum dikenal untuk menggunakan warisan virtual. Untuk mendeklarasikan warisan virtual dalam C++, kata kunci “virtual” digunakan. Baik superclass maupun subclass harus mendeklarasikan metode virtual dengan kata kunci “virtual”. Ini memberitahu compiler C++ bahwa superclass tidak lengkap, dan harus mendapatkan informasi dari subclass untuk menyelesaikannya. Menggunakan subkelas untuk melengkapi superkelas tidak berarti bahwa subkelas saling menimpa jika mereka memiliki kelas dasar yang sama, dan sebagai gantinya kompiler C++ akan menentukan bagian mana yang cocok dengan setiap objek.
Karena kelas dasar virtual diperlukan untuk pewarisan virtual, fungsi global di C++ tidak dapat dideklarasikan virtual. Jenis pewarisan ini hanya dapat digunakan jika mengikuti prinsip pemrograman berorientasi objek (OOP). Alasan untuk ini adalah bahwa fungsi global tidak terkait dengan kelas tertentu, dan biasanya berfungsi sendiri. Tanpa pewarisan superclass dan subclass tidak dapat terjadi, sehingga fungsi global dan pewarisan virtual saling eksklusif. Fungsi global, secara teori, dapat digunakan di dalam fungsi virtual, tetapi kebalikannya mungkin tidak selalu berhasil.
Warisan virtual digunakan untuk memecahkan banyak masalah pemrograman, dan salah satu yang paling berguna adalah resolusi ambiguitas. Dalam pewarisan berganda, seseorang mungkin memiliki kelas dasar A yang memiliki dua subkelas, B dan C, dan kemudian kelas D yang mewarisi dari kedua kelas B dan C. Pola ini biasa disebut “diamond of death” karena jika kelas A, B, dan C semuanya memiliki implementasi dari metode yang sama, tidak mungkin bagi kelas D untuk menentukan implementasi mana yang harus digunakan. Warisan virtual memecahkan masalah ini karena implementasi setiap kelas tetap berbeda, dan karenanya tidak ambigu. Perbedaan ini ditangani oleh objek internal khusus yang disebut tabel virtual (vtables) yang melacak setiap jenis objek, tetapi tabel ini tidak perlu dimanipulasi secara eksplisit oleh programmer karena dibuat ke dalam bahasa.