Diamond Problem: Inheritance Hiyerarşisinde Çakışmaları Çözmek
Diamond problem, bir sınıfın aynı üst sınıftan iki farklı yolla kalıtım aldığında ortaya çıkar. Mesela A sınıfından B ve C sınıfları türüyor, sonra D sınıfı hem B'den hem C'den türüyor. D sınıfı A'nın özelliklerini iki kez miras alır, bu çakışmaya diamond problem denir.
Önce çakışmasız bir örnek yazalım:
1#include <iostream>2using namespace std;34class Animal {5public:6void eat() { cout << "Hayvan yiyor\n"; }7};89class Dog: public Animal {};10class Cat: public Animal {};1112class Hybrid: public Dog, public Cat {};1314int main() {15Hybrid h;16// h.eat(); // HATA: Hangi Dog::eat? Hangi Cat::eat?17return 0;18}Sorun: Hybrid sınıfı eat() metodunu iki yerden alıyor, Dog üzerinden ve Cat üzerinden. Hangisini çağıracak?
Araya `virtual` anahtar kelimesini koyarsak, üst sınıf tek bir kez miras alınır:
1#include <iostream>2using namespace std;34class Animal {5public:6void eat() { cout << "Hayvan yiyor\n"; }7};89class Dog: virtual public Animal {};10class Cat: virtual public Animal {};1112class Hybrid: public Dog, public Cat {};1314int main() {15Hybrid h;16h.eat(); // Çalışır! Tek bir eat() var.17return 0;18}Çıktı:
1Hayvan yiyorVirtual inheritance, derleyiciye "Animal sınıfını sadece bir kez dahil et" der. Dog ve Cat, Animal'ı paylaşır, çoğaltmaz.
Eğer çoklu kalıtım kullanacaksan ve ortak bir üst sınıf varsa, her zaman virtual inheritance yap. Böylece ambiguity (belirsizlik) ortadan kalkar.
Diamond problem, tasarım hatası işaretidir. Çoğu zaman tek kalıtım veya interface deseni daha temizdir. Ama zorunluysa, `virtual` anahtar kelimesi çözüm.
0 yorum