C++'da Kalıtım
Miras temel bir kavramdır OOP (Nesneye Yönelik Programlama) . Bir sınıfın başka bir sınıfın özelliklerini (alanlar ve yöntemler) devralmasına izin verilen mekanizmadır. Kalıtım, mevcut sınıflara dayalı olarak yeni sınıflar oluşturmak anlamına gelir. Başka bir sınıftan miras alan bir sınıf, o sınıfın yöntemlerini ve alanlarını yeniden kullanabilir.
Örnek: Aşağıdaki örnekte Animal temel sınıftır ve Dog Cat ve Cow, Animal sınıfını genişleten türetilmiş sınıflardır.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
Çıkış
Dog barks Cat meows Cow moos
Açıklama:
- Animal, sound() işlevine sahip temel sınıftır.
- Dog Cat ve Cow, her biri kendi sound() yöntemini tanımlayan türetilmiş sınıflardır.
- Main()'da Dog Cat ve Cow nesneleri ayrı ayrı oluşturulur.
- Her nesnede sound()'u çağırdığımızda, ilgili alt sınıf yöntemi çalışır (Köpek havlar, Kedi miyavlar, İnek mırıldanır).
Sözdizimi
C++ class ChildClass : public ParentClass { // Additional fields and methods };
C++'da Kalıtım Nasıl Çalışır?
İki nokta üst üste (:) ile erişim belirteci C++'da kalıtım için kullanılır. Türetilmiş sınıfın (alt sınıf), temel sınıfın (ana sınıf) veri üyelerini (alanlarını) ve üye işlevlerini (yöntemlerini) devralmasına izin verir.
Bir sınıf başka bir sınıfı miras aldığında, ana sınıfın tüm erişilebilir üyelerini alır ve alt sınıf da bunları yeniden tanımlayabilir (geçersiz kılabilir) veya bunlara yeni işlevler ekleyebilir.
C++'da Kalıtım Türleri
Aşağıda C++ tarafından desteklenen farklı kalıtım türleri bulunmaktadır.
1. Tek Miras
Tek kalıtımda bir alt sınıf yalnızca bir süper sınıftan türetilir. Tek ebeveynli bir sınıfın özelliklerini ve davranışını miras alır. Bazen basit miras olarak da bilinir.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Çıkış
This is a Vehicle This Vehicle is Car
2. Çoklu Miras
İçinde Çoklu kalıtım bir sınıf birden fazla üst sınıfa sahip olabilir ve özellikleri tüm üst sınıflardan miras alabilir.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
Çıkış
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Çok Düzeyli Miras
C++'da çok düzeyli kalıtım, bir sınıfın bir miras zinciri oluşturan başka bir türetilmiş sınıftan türetildiği anlamına gelir.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Çıkış
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hiyerarşik Miras
Hiyerarşik kalıtımda, tek bir temel sınıftan birden fazla alt sınıf miras alınır. yani tek bir temel sınıftan birden fazla türetilmiş sınıf oluşturulur. Örneğin arabalar da otobüsler de taşıttır.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
Çıkış
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hibrit Miras
İki veya daha fazla kalıtım türü tek bir programda birleştirildiğinde. Örneğin bir sınıf çoklu kalıtım kullanabilir ve ayrıca çok düzeyli bir miras zincirinin parçası olabilir.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
Çıkış
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hibrit Kalıtım şu sonuçlara yol açabilir: elmas sorunu C++'da. Bu, bir sınıfın her ikisi de aynı temel sınıfı paylaşan iki sınıftan miras alması durumunda meydana gelir. Sonuç olarak türetilmiş sınıf, temel sınıf üyelerinin birden fazla kopyasını alır ve bu da hangisinin kullanılacağı konusunda belirsizlik yaratır.
Not : Çözüm, temel sınıfın yalnızca tek bir kopyasının paylaşılacağı şekilde sanal mirası kullanmaktır.
C++'da Kalıtımın Avantajları
- Kodun Yeniden Kullanılabilirliği : Türetilmiş sınıf, kod çoğaltmasını önleyerek temel sınıfının veri üyelerini ve yöntemlerini doğrudan yeniden kullanabilir.
- Soyutlama: Soyutlamayı zorlayan ortak bir arayüz tanımlayan soyut sınıfları (saf sanal işlevlere sahip sınıflar) destekler.
- Sınıf Hiyerarşisi: Gerçek dünya ilişkilerini modellemek için hiyerarşiler (temel → türetilmiş → daha ileri türetilmiş) oluşturabilirsiniz.
- Polimorfizm: Sanal işlevler aracılığıyla çalışma zamanı polimorfizmini ve ayrıca işlev aşırı yüklemesi ve şablonlar aracılığıyla derleme zamanı polimorfizmini tam olarak destekler.
C++'da Kalıtımın Dezavantajları
- Sıkı Bağlantı: Çocuk sınıfı ana sınıfa bağımlı hale gelir. Temel sınıftaki herhangi bir değişiklik, türetilmiş sınıflarda değişiklikleri zorlayabilir.
- Azaltılmış Esneklik: Bazen kalıtım, kompozisyonun (ilişkisi vardır) daha iyi olacağı ve daha az esnek koda yol açacak şekilde kötüye kullanılır.
- Artan Karmaşıklık: Derin kalıtım hiyerarşileri (çok düzeyli veya hibrit), kodun bakımını ve hata ayıklamasını zorlaştırabilir.
- Elmas Sorunu: Hibrit veya çoklu kalıtımda, aynı temel sınıfın birden çok kez miras alınması durumunda belirsizlik ortaya çıkabilir.
- Sanal İşlevlerin Ek Yükü: Polimorfizm (sanal işlevler) kullanılıyorsa, sanal tablo aramalarından dolayı küçük bir çalışma süresi ek yükü vardır.