inheritance c
Örneklerle C ++ 'da Kalıtımın Önemi:
Kalıtım, nesne yönelimli programlamanın en önemli özelliklerinden biridir.
Kalıtım, bir sınıfın diğer sınıfın özelliklerini ve yöntemlerini elde ettiği tekniktir. Bu şekilde, önceden yazılmış ve doğrulanmış kodu yeniden kullanabiliriz. Başka bir sınıfın özelliklerini alan sınıfa, alt sınıf veya türetilmiş sınıf veya alt sınıf adı verilir.
Özellikleri edinilen sınıfa temel sınıf veya üst sınıf veya üst sınıf denir. Bir sınıf başka bir sınıfı aldığında veya devraldığında, temel sınıfın tüm özellikleri ve yöntemleri türetilmiş sınıf için kullanılabilir, böylece bu kodu yeniden kullanabiliriz.
=> Sıfırdan C ++ Öğrenmek İçin Burayı Ziyaret Edin.
Windows 10 için en iyi kötü amaçlı yazılım temizleme aracı
Ne öğreneceksin:
- Neden Mirasa İhtiyacımız Var?
- Kalıtım Modları
- Kalıtımdaki Yapıcıların / Yıkıcıların Sırası
- Kalıtım Türleri
- Şablon Devralma
- Kompozisyon
- Kompozisyon ve Miras Arasında Nasıl Karar Vermeliyiz?
- Sonuç
- Önerilen Kaynaklar
Neden Mirasa İhtiyacımız Var?
Araba, otobüs, jip vb. Gibi bir araç grubu düşünün. Bu araçların her birinin aşağıdaki diyagramda gösterildiği gibi özellikleri ve yöntemleri olacaktır.
Yukarıdaki araçlar için ayrı sınıflar uygulamamız gerekirse, üç sınıfın hepsinde, üç araç türünün de aşağı yukarı aynı özellikleri sergilediği için aynı kodu yazmamız gerekeceğini görebiliriz. Bu, programımızı verimsiz ve hantal hale getirecek, çünkü çok sayıda yinelenen kod olacak.
Yukarıdaki gibi çoğaltılmış bir kod yazmak yerine, kodun kopyalanmasını önlemek için kalıtım özelliğini uygulayabilir ve ayrıca tek bir kod parçası yazıp üç sınıfın hepsinde kullanabiliriz. Bu resimsel olarak aşağıdaki gibi temsil edilmektedir.
Yukarıdaki şekilde, bir temel sınıf olan 'Araçlar' tanımladık ve bu sınıftan Araba, Otobüs ve Jeep sınıflarını türettik. Ortak yöntemler ve özellikler artık Araçlar sınıfının bir parçasıdır. Diğer sınıflar, Vehicles sınıfından türetildiği için, tüm sınıflar bu yöntemleri ve özellikleri alır.
Bu nedenle, ortak kodu yalnızca bir kez ve üç sınıfa da yazmamız gerekir; Araba, Otobüs ve Jeep onu alacak.
Dolayısıyla, var olan sınıfları miras alarak veya kalıtım mekanizmasını tasarlayarak elde ettiğimiz temel avantaj, kodun yeniden kullanılabilirliğidir.
Daha Fazla Okuma = >> Java Kalıtım Eğitimi
Bir sınıfı miras almak için genel biçim şu şekildedir:
class derived_classname: access_specifier base_classname { };
Buraya ' türetilmiş_sınıfadı 'Türetilmiş sınıfın adıdır,' erişim belirteci 'Türetilmiş sınıfın temel sınıfı miras alması gereken erişim modudur, yani genel, korumalı veya özeldir ve' türetilmiş_sınıfadı 'Türetilmiş sınıfın miras aldığı temel sınıfın adıdır.
Kalıtım Modları
Yukarıdaki kalıtım bildiriminde gösterilen “erişim belirteci” değerleri aşağıda gösterildiği gibi olabilir.
Sınıfı miras aldığımızda belirtilen erişim belirleyiciye bağlı olarak, aşağıda listelendiği gibi çeşitli kalıtım modlarımız vardır.
Kamu Mirası
Genel sözdizimi
class sub_class : public parent_class
Genel erişim belirticisi belirtildiğinde, temel sınıfın genel üyeleri, korumalı üyeler korunurken genel olarak miras alınır. Özel üyeler özel kalır. Bu en popüler kalıtım modudur.
Özel Miras
Genel Sözdizimi
class sub_class : parent_class
Özel miras hiçbir şeyi miras almaz. Özel erişim belirticisi kullanıldığında, temel sınıfın genel ve korumalı üyeleri de özel olur.
Korumalı Miras
Genel Sözdizimi
class sub_class:protected parent_class
Korumalı erişim belirticisi kullanıldığında, temel sınıfın genel ve korumalı üyeleri türetilmiş sınıfta korumalı üyeler olur.
Temel sınıf için özel erişim belirteci kullandığımızda, temel sınıf üyelerinden hiçbirinin miras alınmadığını unutmayın. Hepsi türetilmiş sınıfta özel hale gelir.
Aşağıda, tüm erişim modlarının tablo halindeki temsili ve kalıtım için yorumları verilmiştir.
Türetilmiş Sınıf -> Temel sınıf | Özel | halka açık | Korumalı |
---|---|---|---|
Özel | Miras değil | Devralınmamış | Devralınmamış |
halka açık | Özel | halka açık | Korumalı |
Korumalı | Özel | Korumalı | Korumalı |
Kalıtımdaki Yapıcıların / Yıkıcıların Sırası
Sınıflar miras alındığında, oluşturucular, sınıfların miras alındığı sırayla çağrılır. Bir temel sınıfımız ve bu temel sınıfı miras alan bir türetilmiş sınıfımız varsa, ilk olarak temel sınıf yapıcısı (ister varsayılan ister parametreleştirilmiş olsun), ardından türetilmiş sınıf yapıcısı çağrılır.
Aşağıdaki program, kalıtımdaki yapıcıların sırasını gösterir. Bir varsayılan kurucuya ve parametreli bir kurucuya sahip olan bir Base sınıfımız var. Bundan 'Türetilmiş' olarak adlandırılan ve ayrıca bir varsayılan ve başka bir parametreleştirilmiş kurucuya sahip bir sınıf türetiyoruz.
Bu programın çıktısı, kurucuların çağrılma sırasını gösterir.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Çıktı:
Temel sınıf varsayılan yapıcısı
Temel sınıf varsayılan yapıcısı
Türetilmiş sınıf varsayılan yapıcısı
Temel sınıf parametreleştirilmiş yapıcı
Türetilmiş sınıf parametreleştirilmiş yapıcı
google web yöneticisi araçları bozuk bağlantı denetleyicisi
Temel sınıf nesnesini oluşturduktan sonra, varsayılan bir kurucu ile türetilmiş bir sınıf nesnesi oluşturduğumuzu görüyoruz. Bu nesne oluşturulduğunda, önce temel sınıf varsayılan yapıcısı çağrılır ve ardından türetilmiş sınıf yapıcısı çalıştırılır.
Benzer şekilde, türetilmiş sınıf nesnesi parametreleştirilmiş yapıcı kullanılarak oluşturulduğunda, ilk olarak temel sınıf parametreleştirilmiş yapıcısı çağrılır ve sonra türetilmiş sınıf yapıcısı çağrılır.
Temel sınıfta parametreli yapıcı yoksa, parametreli türetilmiş sınıf nesnesini oluşturmak için bile varsayılan kurucunun çağrılacağını unutmayın.
Ancak, türetilmiş sınıf nesnelerini oluştururken temel sınıf yapıcısının neden çağrıldığı sorusu kalır.
Bir kurucunun sınıfın nesnelerini yaratmak ve ayrıca sınıfın üyelerini başlatmak için kullanıldığını biliyoruz. Türetilmiş sınıf nesnesi oluşturulduğunda, yapıcısı yalnızca türetilmiş sınıf üyeleri üzerinde kontrole sahiptir.
Bununla birlikte, türetilmiş sınıf, temel sınıfın üyelerini de miras alır. Yalnızca türetilmiş sınıf kurucusu çağrılsaydı, türetilmiş sınıf tarafından miras alınan temel sınıf üyeleri düzgün şekilde başlatılmazdı.
Sonuç olarak, tüm nesne verimli bir şekilde oluşturulmayacaktır. Türetilmiş bir sınıf nesnesi oluşturulduğunda ilk olarak tüm temel sınıf yapıcılarının çağrılmasının nedeni budur.
Kalıtım Türleri
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 şekilde gösterildiği gibi aşağıdaki kalıtım türlerine sahibiz.

Bu türlerin her birini, 'Kalıtım Türleri' konulu bir sonraki eğitimimizde inceleyeceğiz.
Şablon Devralma
Uygulamamız şablonları içerdiğinde, şablon sınıflarını miras almamız veya türetmemiz gerekir ve orada şablon kalıtımını kullanırız.
Şablonları kullanarak kalıtımı daha iyi anlamak için doğrudan bir programlama Örneğine geçelim.
#include using namespace std; //template inhertance templateclass basecls_Template { public: T value; basecls_Template(T value) { this->value = value; } void displayVal() { cout << value << endl; } }; //derived class inherits basecls_Template class derivedcls_Child : public basecls_Template { public: derivedcls_Child(/* no parameters */): basecls_Template( 0 ){ // default char is NULL; } derivedcls_Child(char c): basecls_Template( c ) { ; } void displayVal_drvd() { displayVal(); } }; int main() { basecls_Template obj( 100 ); derivedcls_Child obj1( 'A' ); cout<<'basecls_Template obj = '; obj.displayVal(); // should print '100' cout< Çıktı:
basecls_Template obj = 100
türetilmişcls_Child obj1 (basecls_Template = A'dan miras alındı
Yukarıdaki programda, temel sınıf için sınıf şablonunu tanımlayan basecls_Template adında bir şablonumuz var. Ardından, bir şablon sınıfından türetmek istediğimiz bir türetilmişcls_Child sınıfı tanımlarız.
Ancak basecls_Template sınıfının yalnızca bir tür olduğunu ve bir sınıf olmadığını unutmayın. Bu nedenle, türetilmişcls_Child sınıfını bu şablondan türetemiyoruz.
Bu nedenle, alt sınıfı şöyle ilan edersek:
class derivedcls_Child : public basecls_Template
Bu bir hatayla sonuçlanacaktır. Basecls_Template olmasının nedeni, sınıf değil veri türüdür. Bu nedenle, basecls_Template üyelerini miras almak için, ondan türetmeden önce onu ilk kez somutlaştırmalıyız.
Bu nedenle yukarıdaki ifade, Türetilmişcls_Child sınıfı: genel basecls_Template iyi çalışıyor.
Bu açıklamada, basecls_Template şablonunu bir karakter sınıfı şablonuna somutlaştırdık. Bu örneklenmiş şablon sınıfını bir kez kullandığımızda, nesneler oluşturmak ve kullanmak gibi diğer şeyler olağan kalıtım çalışmasıyla çakışır.
Kompozisyon
Şimdiye kadar miras ilişkilerini gördük. Kalıtım, temelde, ilişkinin bir parçayı gösterdiği ilişki türlerini tasvir eder. Örneğin, Yılan, bir tür Sürüngendir. Reptile'ın Animal sınıfının bir parçası olduğunu da söyleyebiliriz.
Sonuç olarak, kalıtım gösterir 'IS-A' türetilmiş sınıfın temel sınıfın bir parçası olduğunu söyleyebileceğimiz türden ilişkiler.
İlişkileri bir bütün olarak da temsil edebiliriz. Örneğin, Maaş sınıfının Çalışan sınıfının bir parçası olduğunu söylersek, o zaman onu doğru şekilde temsil etmiyoruz. Çalışanların maaşı olduğunu biliyoruz. Bu nedenle “İşçinin maaşı var” demek daha uygundur.
Benzer şekilde Taşıtlar sınıfını örnek alırsak Araç Motorlu veya Araç şasili diyebiliriz. Böylece tüm bu ilişkiler 'HAS-A' başka bir sınıfta bulunan tüm bir nesneyi temsil eden ilişkiler. Bu şu şekilde tanımlanır: Kompozisyon .
Kompozisyonla tasvir edilen ilişkiler birbirine bağlıdır. Örneğin, Araç olmadan şasi olamaz. Benzer şekilde, Maaş bir Çalışan olmadan var olamaz.
Kompozisyonu aşağıda gösterildiği gibi şematik olarak gösterebiliriz:

Kompozisyon ayrıca Muhafaza olarak da adlandırılır. Yukarıdaki gösterimde, bir ebeveyn sınıfı gösterdik. Kalıtımın aksine, ebeveyn sınıfın içine bir alt sınıf nesnesi ekleriz. Bu sınırlama veya kompozisyon.
Windows 10 için en iyi casus yazılım önleme
Bunu anlamak için bir programlama Örneği alalım.
#include using namespace std; //Composition example //Child class - address class Address { public: string houseNo, building, street, city, state; //Initialise the address object Address(string houseNo,string building,string street, string city, string state) { this->houseNo = houseNo; this->building = building; this->street = street; this->city = city; this->state = state; } }; //Parent class - Employee class Employee { private: Address* address; //composition->Employee has an address public: int empId; string empName; Employee(int empId, string empName, Address* address) { this->empId = empId; this->empName = empName; this->address = address; } void display() { cout< Çıktı:
10001 Ved
A-101 Gümüş Yaylar Aundh Pune Maharashtra
Bu örnekte, bir üst sınıf Çalışan ve bir alt sınıf Adresimiz var. Employee üst sınıfının içinde, Address sınıfına bir işaretçi bildirdik ve bu nesneyi Employee yapıcısında başlattık. Böylece, Çalışanın bir Adrese sahip olduğu ilişkiyi kompozisyon olarak tasvir ederiz.
Kompozisyon ve Miras Arasında Nasıl Karar Vermeliyiz?
Kompozisyon ve kalıtım, hem sınıflar arasındaki ilişkileri tasvir eder. Kalıtım 'IS-A' ilişkisini tasvir ederken, kompozisyon 'HAS-A' ilişkisini tasvir ediyor.
Şimdi soru, mirası ne zaman kullanmalıyız ve kompozisyonu ne zaman kullanmalıyız? Aslında, ikisini de ne zaman kullanmamız gerektiği gibi kesin durumlara karar veremiyoruz. Bunun nedeni, her birinin kendine özgü avantajları ve dezavantajları olmasıdır.
Her ikisi de kodun yeniden kullanılabilirliğini destekler. Kalıtım, çözümler karmaşık hale geldikçe kodu hantal hale getirebilir, ancak aynı zamanda mevcut kodu genişletmemize de izin verir. Bu nedenle, gereksinimimiz yeni sınıf içindeki başka bir sınıfın özelliklerini ve yöntemini değiştirmek ve kullanmak olduğunda kalıtımı kullanmalıyız.
Başka bir deyişle, daha fazla özellik eklemek ve mevcut sınıfı genişletmek istediğimizde. Öte yandan, başka bir sınıfın özelliklerini ve davranışını değiştirmek istemediğimizde, onu sınıf içinde kullandığımızda, kompozisyona gidiyoruz.
Bu nedenle, kompozisyon veya mirasın kullanılıp kullanılmayacağına dair en iyi karar, belirli durum için her iki tekniğin artılarını ve eksilerini tartarak verilecektir.
= >> Java'da Kompozisyon da okuyun
Sonuç
Böylelikle miras konusundaki konumuzun sonuna gelmiş bulunuyoruz. Çeşitli kalıtım biçimleri gördük. Bir sonraki eğitimimizde keşfedeceğimiz kalıtım türlerini de gördük. Miras durumunda icra edilen kurucuların sırasını öğrendik.
Ayrıca şablonlar ve kalıtım hakkında da çalıştık. Şablonun kendisi bir veri türü olduğundan ve bir veri türünden miras alamayacağımız için, bir şablonu kalıtımda kullanmadan önce somutlaştırmamız gerekir.
Kompozisyon, başka bir sınıf ilişkisi türüdür ve önce durumu tam olarak bilmemiz gerekir ve sonra yalnızca kompozisyon veya kalıtım kullanıp kullanmayacağımıza karar verebiliriz.
Yaklaşan eğitimimizde, kalıtım türleri hakkında daha çok şey göreceğiz.
=> Burada Basit C ++ Eğitim Serisine Dikkat Edin.
Önerilen Kaynaklar
- C ++ 'da Kalıtım Türleri
- C ++ 'da Çalışma Zamanı Polimorfizmi
- C ++ 'da Arkadaş İşlevleri
- Bir Web Sayfasındaki Açılır Öğeleri Kullanmak için Selenium Select Sınıfı Kullanımı - Selenium Eğitimi # 13
- C ++ 'da Sınıflar ve Nesneler
- C ++ 'da Statik
- Unix Borular Eğitimi: Unix Programlamada Borular
- Java Arayüzü ve Örneklerle Soyut Sınıf Eğitimi