C ++ Kalıtım
Nesne yönelimli programlamadaki en önemli kavramlardan biri kalıtımdır. Kalıtım, bir sınıfı başka bir sınıf açısından tanımlamamıza izin verir, bu da bir uygulamayı oluşturmayı ve sürdürmeyi kolaylaştırır. Bu aynı zamanda kod işlevselliğini ve hızlı uygulama süresini yeniden kullanma fırsatı sağlar.
Bir sınıf oluştururken, tamamen yeni veri üyeleri ve üye işlevler yazmak yerine, programcı yeni sınıfın mevcut bir sınıfın üyelerini miras alması gerektiğini belirleyebilir. Bu mevcut sınıfabase sınıf ve yeni sınıf, derived sınıf.
Kalıtım fikri, is ailişki. Örneğin, memeli IS-A hayvan, köpek IS-A memelidir, dolayısıyla köpek IS-A hayvandır vb.
Temel ve Türetilmiş Sınıflar
Bir sınıf, birden fazla sınıftan türetilebilir, yani verileri ve işlevleri birden çok temel sınıftan devralabilir. 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 derived-class: access-specifier base-class
Erişim belirleyicinin aşağıdakilerden biri olduğu public, protected, veya privateve temel sınıf, önceden tanımlanmış bir sınıfın adıdır. Erişim tanımlayıcı kullanılmıyorsa, varsayılan olarak özeldir.
Temel bir sınıf düşünün Shape ve türetilmiş sınıfı Rectangle aşağıdaki gibi -
#include <iostream>
using namespace std;
// Base class
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Total area: 35
Erişim Kontrolü ve Kalıtım
Türetilmiş bir sınıf, temel sınıfının özel olmayan tüm üyelerine erişebilir. Bu nedenle, türetilmiş sınıfların üye işlevlerine 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 -
Giriş | halka açık | korumalı | özel |
---|---|---|---|
Aynı sınıf | Evet | Evet | Evet |
Türetilmiş sınıflar | Evet | Evet | Hayır |
Dış dersler | Evet | Hayır | Hayır |
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 oluşturucuları, yıkıcıları ve kopya oluşturucuları.
- Temel sınıfın aşırı yüklenmiş operatörleri.
- Temel sınıfın arkadaş işlevleri.
Kalıtım Türü
Bir temel sınıftan bir sınıf türetilirken, temel sınıf aracılığıyla miras alınabilir public, protected veya privatemiras. Kalıtım türü, yukarıda açıklandığı gibi erişim tanımlayıcısı tarafından belirlenir.
Neredeyse hiç kullanmıyoruz protected veya private miras, ama publickalıtım yaygın olarak kullanılmaktadır. Farklı devralma türleri kullanılırken aşağıdaki kurallar uygulanır -
Public Inheritance - Bir sınıftan bir sınıf türetirken public temel sınıf public temel sınıfın üyeleri olur public türetilmiş sınıfın üyeleri ve protected temel sınıfın üyeleri olur protectedtüretilmiş sınıfın üyeleri. Temel sınıfprivate üyelere hiçbir zaman doğrudan türetilmiş bir sınıftan erişilemez, ancak üyelere yapılan çağrılarla erişilebilir public ve protected temel sınıfın üyeleri.
Protected Inheritance - Bir protected temel sınıf public ve protected temel sınıfın üyeleri olur protected türetilmiş sınıfın üyeleri.
Private Inheritance - Bir private temel sınıf public ve protected temel sınıfın üyeleri olur private türetilmiş sınıfın üyeleri.
Çoklu Kalıtım
Bir C ++ sınıfı, üyeleri birden fazla sınıftan devralabilir ve işte genişletilmiş sözdizimi -
class derived-class: access baseA, access baseB....
Erişim nerede public, protected, veya privateve her temel sınıf için verilecek ve yukarıda gösterildiği gibi virgülle ayrılacaktır. Aşağıdaki örneği deneyelim -
#include <iostream>
using namespace std;
// Base class Shape
class Shape {
public:
void setWidth(int w) {
width = w;
}
void setHeight(int h) {
height = h;
}
protected:
int width;
int height;
};
// Base class PaintCost
class PaintCost {
public:
int getCost(int area) {
return area * 70;
}
};
// Derived class
class Rectangle: public Shape, public PaintCost {
public:
int getArea() {
return (width * height);
}
};
int main(void) {
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
// Print the total cost of painting
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -
Total area: 35
Total paint cost: $2450