C++ Ile Nesne Yönelimli Programlama (Miras/Kalıtım(Inheritance))
--
Bu yazılar https://www.tutorialspoint.com/cplusplus/ adresindeki yazı dizilerinin çevirileridir.
Nesne yönelimli programlamadaki en önemli konseptlerden biri miras kavramıdır. Miras, bir sınıfı başka bir sınıf açısından tanımlamaya izin verir, bu da bir uygulama oluşturmayı ve sürdürmeyi kolaylaştırır. Aynı zamanda kod işlevselliğini yani yeniden kullanma ve hızlı uygulama süresi için bir fırsat yaratır.
Bir sınıf oluştururken, tamamen yeni veri üyeleri ve üye fonksiyonları yazmak yerine, programcı yeni sınıfı mevcut bir sınıfın üyelerini miras alıp oluşturmaya karar verebilir. Bu mevcut sınıfa temel sınıf adı verilir ve yeni sınıfa türetilmiş sınıf adı verilir.
Miras fikri bir ilişkidir. Örneğin, memeli BİR hayvan, köpek BİR memelidir, dolayısıyla köpek BİR hayvandır vb.
Temel ve Türetilmiş Sınıflar
Bir sınıf, birden fazla sınıftan türetilebilir; bu, verileri ve fonksiyonları birden çok temel sınıftan devralabileceği anlamına gelir. Türetilmiş bir sınıfı tanımlamak için, temel sınıf(lar)ı belirtmek için bir sınıf türetme listesi kullanırız. Bir sınıf türetme listesi, bir veya daha fazla temel sınıfı adlandırır ve şu biçime sahiptir:
class türetilmiş-sınıf: erişim-belirteci temel-sınıf
Erişim belirtecinin public(genel),protected(korumalı) veya private(özel) olduğu ve temel sınıfın önceden tanımlanmış bir sınıfın adı olduğu durumlarda temel-sınıf önceden tanımlanmış bir sınıfın adıdır. Eğer erişim belirteci kullanılmazsa varsayılan olarak private(özel) kullanılır.
Aşağıdaki Sekil temel sınıfını ve ondan türetilmiş Dikdortgen sınıfını inceleyelim -
#include <iostream>
using namespace std;
// Temel sınıf
class Sekil {
public:
void genisligiAyarla(int g) {
genislik = g;
}
void yuksekligiAyarla(int y) {
yukseklik = y;
}
protected:
int genislik;
int yukseklik;
};
// Türetilmiş sınıf
class Dikdortgen: public Sekil {
public:
int alaniHesapla() {
return (genislik * yukseklik);
}
};
int main(void) {
Dikdortgen Dikd;
Dikd.genisligiAyarla(5);
Dikd.yuksekligiAyarla(7);
// Nesnenin alanını yazdır.
cout << “Toplam alan: “ << Dikd.alaniHesapla() << endl;
return 0;
}
Kod derlenip çalıştırıldığında, takip eden sonucu alırız -
Toplam alan: 35
Erişim Kontrolü ve Miras
Türetilmiş bir sınıf, temel sınıfın private(özel) olmayan tüm üyelerine erişebilir. Böylelikle, türetilmiş sınıfların üye fonksiyonlarına erişilememesi gereken temel sınıf üyeleri, temel sınıfta özel olarak bildirilmelidir.
Farklı erişim türlerini aşağıdakilere göre özetleyebiliriz — bunlara kimlerin erişebileceği :
Türetilmiş bir sınıf, aşağıdaki istisnalarla tüm temel sınıf yöntemlerini miras alır -
-Temel sınıfın yapıcı, yıkıcı ve kopya yapıcıları
-Temel sınıfın aşırı yüklenen(overload) operatörleri
-Temel sınıfın arkadaş fonksiyonları
Mirasın Tipleri
Bir temel sınıftan bir sınıf türetilirken, temel sınıf public, protected veya public miras yoluyla miras alınabilir. Miras türü, yukarıda açıklandığı gibi erişim belirticisi tarafından belirlenir.
Protected veya private mirası neredeyse hiç kullanmıyoruz genel olarak public miras kullanılır.
Farklı miras türleri kullanılırken aşağıdaki kurallar uygulanır -
Public(Genel) Miras — Bir genel temel sınıftan bir sınıf türetilirken, temel sınıfın genel üyeleri türetilmiş sınıfın genel üyeleri olur ve temel sınıfın protected üyeleri türetilmiş sınıfın protected üyeleri olur. Bir temel sınıfın private üyelerine hiçbir zaman doğrudan türetilmiş bir sınıftan erişilemez, ancak temel sınıfın public ve protected üyelerine yapılan çağrılar aracılığıyla erişilebilir.
Protected(Korumalı) Miras — Korumalı bir temel sınıftan türetilirken, temel sınıfın public ve protected üyeleri türetilmiş sınıfın protected üyeleri haline gelir.
Private(Özel) Miras — Private bir temel sınıftan türetilirken, temel sınıfın public ve protected üyeleri türetilmiş sınıfın private üyeleri olur.
Çoklu Miras(Multiple Inheritance)
Bir C++ sınıfı, üyeleri birden fazla sınıftan miras alabilir ve işte genişletilmiş sözdizimi -
class türetilmiş-sınıf: Aerişim-tabanı, Berişim-tabanı….
Erişim public, protected veya private olduğunda her temel sınıf için verilenler yukarıda gösterildiği gibi virgülle ayrılacaktır. Takip eden örnekle görelim -
#include <iostream>
using namespace std;
// Temel sınıf Şekil
class Sekil {
public:
void genisligiAyarla(int g) {
genislik = g;
}
void yuksekligiAyarla(int y) {
yukseklik = y;
}
protected:
int genislik;
int yukseklik;
};
// Temel sınıf BoyaUcreti
class BoyaUcreti {
public:
int ucretiHesapla(int alan) {
return alan * 70;
}
};
// Türetilmiş sınıf
class Dikdortgen: public Sekil, public BoyaUcreti {
public:
int alaniHesapla() {
return (genislik * yukseklik);
}
};
int main(void) {
Dikdortgen Dikd;
int alan;
Dikd.genisligiAyarla(5);
Dikd.yuksekligiAyarla(7);
alan = Dikd.alaniHesapla();
// Nesnenin alanını yazdır
cout << “Toplam alan: “ << Dikd.alaniHesapla() << endl;
// Boyama ücretini yazdır
cout << “Toplam boyama ücreti: $” << Dikd.ucretiHesapla(alan) << endl;
return 0;
}
Kod derlenip çalıştırıldığında takip eden sonucu oluşturur -
Toplam alan: 35
Toplam boyama ücreti: $2450
https://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm