types inheritance c
C ++ 'daki Tüm Kalıtım Türlerini Örneklerle Keşfedin.
Önceki eğitimimizde, C ++ 'da kalıtım hakkında bilgi edindik. Sınıfın türetilme şekline veya bir sınıfın kaç tane temel sınıf miras aldığına bağlı olarak, aşağıdaki kalıtım türlerine sahibiz:
- Tek Kalıtım
- Çoklu Kalıtım
- Çok Düzeyli Kalıtım
- Hiyerarşik Kalıtım
- Hibrit Kalıtım
=> Tam C ++ Öğreticiler listesini Keşfetmek İçin Buraya Bakın.
Ne öğreneceksin:
Kalıtım Türleri
Aşağıda verilen, çeşitli miras türlerinin resimli bir temsilidir.
Her kalıtım türünü aşağıdaki bölümlerde örneklerle göreceğiz.
# 1) Tek Kalıtım
Tekli kalıtımda, bir sınıf yalnızca bir temel sınıftan türetilir. Bu, bir üst sınıftan türetilen yalnızca bir alt sınıf olduğu anlamına gelir.
Tek kalıtım genellikle şu şekilde beyan edilir:
class subclassname : accessspecifier superclassname { //class specific code; };
Aşağıda tam bir Tek Kalıtım Örneği verilmiştir.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< Çıktı:
Köpeğin 4 bacağı var
Köpeğin 1 kuyruğu var
Köpek Havları !!!
Alt sınıf bir köpek çıkardığımız temel sınıf olarak bir Hayvan sınıfımız var. Sınıf köpeği, Hayvan sınıfının tüm üyelerini miras alır ve çıktıdan görüldüğü gibi kendi özelliklerini içerecek şekilde genişletilebilir.
Tek kalıtım, kalıtımın en basit şeklidir.
# 2) Çoklu Kalıtım
Çoklu Kalıtım, aşağıda resimsel olarak gösterilmiştir.
Çoklu miras, bir sınıfın birden fazla sınıftan türetildiği bir kalıtım türüdür. Yukarıdaki diyagramda gösterildiği gibi, C sınıfı, A sınıfı ve B sınıfı ebeveyni olan bir alt sınıftır.
Gerçek hayattaki bir senaryoda, bir çocuk babasından ve annesinden miras alır. Bu, çoklu mirasın bir örneği olarak düşünülebilir.
Çoklu Kalıtımı göstermek için aşağıdaki programı sunuyoruz.
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
Çıktı:
Rulo Numarasını Girin: 25
En yüksek iki işareti girin: 40 50
CoCurricular Aktiviteleri için işareti girin: 30
Rulo No: 25
Toplam not: 120
Ortalama not: 40
Yukarıdaki örnekte, üç sınıfımız var, yani öğrenci_ işaretleri, cocurricular_marklar ve Sonuç. Student_marks sınıfı, öğrencinin konu işaretini okur. Sınıf cocurricular_marks, öğrencinin müfredatla ilgili etkinliklerdeki notlarını okur.
Sonuç sınıfı, ortalama notlarla birlikte öğrenci için total_markları hesaplar.
Bu modelde, Sonuç sınıfı, konudan Sonuç ve müfredat dışı etkinlik puanlarını hesaplarken, öğrenci_ işaretleri ve cocurricular_marklardan türetilir.
Bu, çoklu miras sergiler.
Elmas sorunu
Elmas Problemi aşağıda resimsel olarak gösterilmektedir:
veri ambarında meta veriler nedir
Burada, Anne ve Baba olmak üzere iki sınıfı miras alan bir çocuk sınıfımız var. Bu iki sınıf da Kişi sınıfını miras alır.
Şekilde gösterildiği gibi, Çocuk sınıfı, Kişi sınıfının özelliklerini iki kez, yani bir kez Babadan ve ikinci kez Anneden miras alır. Derleyici hangi yöne gideceğini anlayamadığından bu durum belirsizliğe yol açar.
Bu senaryo, elmas şeklindeki bir mirasa sahip olduğumuzda ortaya çıktığından, bu soruna ünlü olarak ' Elmas Problemi ”.
C ++ 'da uygulanan Diamond problemi, derlemede belirsizlik hatasına neden olur. Kök taban sınıfını sanal hale getirerek bu sorunu çözebiliriz. Polimorfizm üzerine yakında çıkacak eğitimimizde 'sanal' anahtar kelime hakkında daha fazla bilgi edineceğiz.
# 3) Çok Düzeyli Kalıtım
Çok düzeyli kalıtım aşağıda temsil edilmektedir.
Çok düzeyli kalıtımda, bir sınıf başka bir türetilmiş sınıftan türetilir. Bu kalıtım, uygulamamız ters gitmediği sürece birçok seviyeye sahip olabilir. Yukarıdaki diyagramda, C sınıfı, B Sınıfından türetilmiştir. Sınıf B, daha sonra, A sınıfından türetilmiştir.
Bir Çok Seviyeli Devralma örneği görelim.
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< Çıktı:
Yavru köpeğin 4 bacağı vardır
Yavru köpeğin 1 kuyruğu var
Puppy Barks !!! Köpek Ağlıyor !!
Burada, Tek kalıtım örneğini, Dog sınıfından miras alan ve daha sonra Animal sınıfından miras alan yeni bir Puppy sınıfı olacak şekilde değiştirdik. Puppy sınıfının, üstündeki her iki sınıfın da özelliklerini ve yöntemlerini aldığını ve kullandığını görüyoruz.
# 4) Hibrit Kalıtım
Hibrit kalıtım aşağıda tasvir edilmiştir.
Hibrit kalıtım genellikle birden fazla kalıtım türünün bir kombinasyonudur. Yukarıdaki gösterimde, melez bir kalıtım elde etmek için çoklu kalıtım (B, C ve D) ve çok düzeyli kalıtım (A, B ve D) var.
Hibrit Kalıtımın bir örneğini görelim.
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
Çıktı:
Öğrenci kimliğini ve öğrenci adını girin 25 Ved
3 konu işareti girin: 89 88 87
Spor işaretlerini girin: 40
Toplam not = 264
Ortalama puanlar = 88
Ortalama + Spor işaretleri = 128
Burada Öğrenci, İşaretler, Spor ve Sonuç olmak üzere dört sınıfımız var. Notlar öğrenci sınıfından alınır. Sınıf Sonucu, konu işaretlerinin yanı sıra spor işaretlerinin sonucunu hesaplarken İşaretler ve Sporlardan türetilir.
Çıktı, üç sınıfın tümünün özelliklerini alan bir Result sınıfı nesnesi oluşturularak oluşturulur.
Hibrit kalıtımda da uygulamanın, daha önce belirtildiği gibi 'sanal' anahtar kelime kullanılarak çözülebilecek 'Elmas Sorunu' ile sonuçlanabileceğini unutmayın.
# 5) Hiyerarşik Kalıtım
Hiyerarşik kalıtımda, yukarıdaki gösterimde gösterildiği gibi, birden fazla sınıf tek bir temel sınıftan miras alır. Bu, ona bir hiyerarşi yapısı verir.
Aşağıda, Hiyerarşik Kalıtımı gösteren Örnek verilmiştir.
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< Çıktı:
Bir dikdörtgenin uzunluğunu ve genişliğini girin: 10 5
Dikdörtgenin alanı = 50
Üçgenin tabanını ve yüksekliğini girin: 4 8
Üçgenin alanı = 16
Karenin bir kenarının uzunluğunu girin: 5
Karenin alanı = 20
Yukarıdaki örnek, Shape sınıfının klasik bir örneğidir. Temel bir Shape sınıfımız var ve üç sınıf, yani dikdörtgen, üçgen ve kare ondan türetilmiştir.
Her bir türetilmiş sınıfın alanı hesaplamak için kendi yöntemi varken, Shape sınıfındaki verileri okumak için bir yöntemimiz var. Ana işlevde, her nesne için verileri okur ve ardından alanı hesaplarız.
Sonuç
Diğer programlama dilleriyle karşılaştırıldığında, C ++ dili her tür kalıtımı destekler. Aslında, C ++ 'nın kalıtım için çok iyi bir desteğe sahip olduğunu söyleyebiliriz. C ++ kullanarak gerçek zamanlı problemleri daha etkin bir şekilde modelleyebiliriz.
Bu öğreticide, C ++ tarafından desteklenen tüm kalıtım türlerini gördük.
Ayrıca Oku = >> Java'da Kalıtım Türleri
Yaklaşan eğitimimizde, OOP'nin polimorfizm özelliği hakkında daha fazla bilgi edineceğiz.
=> Tam C ++ ÜCRETSİZ Eğitim Serisini Buradan Kontrol Edin.
Önerilen Kaynaklar
- C ++ 'da Kalıtım
- C ++ Veri Türleri
- Yazılım Projelerinde Risk Türleri
- Python Veri Türleri
- En İyi ÜCRETSİZ C # Eğitim Serisi: Yeni Başlayanlar İçin En İyi C # Rehberi
- Unix Kabuk Döngü Türleri: Unix'te Döngüye Kadar Döngüde Yapın
- Mockito Tarafından Sağlanan Farklı Eşleştirici Türleri
- Her Test Cihazının Bilmesi Gereken 7 Yazılım Hatası Türü