virtual
- C++ kursu
- Orta seviye
- Ders 14/116
- 5 dk
virtual ile sanal metot ve polimorfizmi öğrenirsin.
virtual
Bir temel sınıfın üye fonksiyonunu virtual yaparak, türetilmiş sınıfın kendi sürümünü çalıştırabilmesini sağlarsın. Buna çok biçimlilik (polymorphism) denir. İşaretçi veya başvuru üzerinden çağrıldığında, nesnenin gerçek türüne bakılır.
Örnek: class Animal { public: virtual void speak() { std::cout << "Ses"; } };. Dog bunu yeniden tanımlar: void speak() { std::cout << "Hav"; }. Animal* a = &dog; a->speak(); çağrısı Hav yazdırır; çünkü virtual sayesinde dog'un gerçek türü seçilir. virtual yoksa Ses yazdırılırdı.
İşaretçi ile çağrı
Çok biçimlilik çalışma zamanında gerçekleşir; bunun için bir temel sınıf işaretçisi veya başvurusu gerekir. Doğrudan nesne üzerinden çağrı yapılamaz; çünkü derleyici statik türü kullanır. İşaretçide -> işareti üye erişimi için kullanılır.
Örnek: Dog dog; Animal* a = &dog; a->speak();. Burada a bir Animal işaretçisidir ama dog nesnesini gösterir. virtual sayesinde Dog::speak çağrılır. İşaretçi yerine başvuru da kullanılabilir: Animal& r = dog; r.speak();. İkisi de aynı sonucu verir.
Uygulama virtual speak ile çok biçimlilik
Animal sınıfını tanımla: public: altında virtual void speak() { std::cout << "Ses"; }. Dog sınıfını Animal'dan türet ve void speak() { std::cout << "Hav"; } ile yeniden tanımla. main içinde Dog dog; oluştur, Animal* a = &dog; al ve a->speak() çağır.
Başlangıç kodu
#include <iostream>
// Animal ve Dog sınıflarını tanımla
int main() {
// Dog oluştur, Animal* ile speak çağır
return 0;
}Örnek çözüm
#include <iostream>
class Animal {
public:
virtual void speak() {
std::cout << "Ses";
}
};
class Dog : public Animal {
public:
void speak() {
std::cout << "Hav";
}
};
int main() {
Dog dog;
Animal* a = &dog;
a->speak();
return 0;
}Beklenen çıktı
Hav
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 virtual anahtar kelimesini yaz
class Animal { public: ____ void speak() { } };
class Animal { public: virtual void speak() { } };
Açıklama: virtual, speak fonksiyonunun yeniden tanımlanabilir olmasını sağlar.
2 Animal* a = &dog; a->speak(); çağrısı ne yazdırır? (speak virtual, Dog::speak "Hav" yazdırır)
Animal* a = &dog;
a->speak();- Ses
- Derleme hatası
- Hiçbir şey
- Hav Doğru cevap
Açıklama: virtual sayesinde dog'un gerçek türü seçilir ve Hav yazdırılır.
3 Parçayı rolüne eşle
| Kavram | Anlamı |
|---|---|
virtual |
Çok biçimlilik sağlar |
-> |
İşaretçi ile üye erişimi |
Animal* |
Temel sınıf işaretçisi |
&dog |
İşaretçinin gösterdiği nesne |