Birbirinden miras alan sınıflar birbirine mantıksal olarak bağlıdır. Örneğin Öğretmen sınıfı İnsan sınıfından miras alabilir. Çünkü bir öğretmen aynı zamanda bir insandır. Öğretmen insana ait olan özellikleri ve davranışları taşır fakat öte yandan At sınıfı, İnsan sınıfından miras alamaz. Çünkü atlar birer insan değildir.
Atların insan olmaması bu iki canlı arasında benzerliklerin olmayacağı anlamına gelmiyor. Örneğin atlar koşar, insanlar da koşar, atlar nefes alır, insanlar da nefes alır …
Farklı nesnelerin ortak davranışları paylaşması durumunda interface (arayüz) kullanıyoruz. Aslında bakarsak interface kavramı, JAVA programlama gelmektedir ve C++’da interface adında bir şey bulunmamaktadır. Onun yerine abstract class vardır.
En az bir tane pure virtual function içeren sınıflar abstract class olarak nitelendirilir:
// Abstract class
class Run {
public:
virtual void run() = 0; // pure virtual function
};daha sonra inheritance yapar gibi bir derived class oluşturuyoruz ve pure virtual fonksiyonumuz override yapıyoruz:
class Human : public Run {
public:
// Inherited via Run
void run() override{
cout << "human run" << endl;
}
};Aynı şekilde ikinci bir sınıf daha oluşturup daha sonra her sınıfa ait run fonksiyonunu çağırıyoruz:
#include <iostream>
using namespace std;
// Abstract class
class Run {
public:
virtual void run() = 0; // pure virtual function
};
class Human : public Run {
public:
// Inherited via Run
void run() override{
cout << "human run" << endl;
}
};
class Horse : public Run {
public:
// Inherited via Run
void run() override{
cout << "horse run" << endl;
}
};
int main() {
//Run r; // HATA: Abstract classdan nesne tanımlanmaz
// sadce ve sadece varislerinin üzerinden ona ulaşabiliriz.
Human human;
human.run(); // human run
Horse horse; // horse run
horse.run();
}Böyle bir kullanım belki ilk başta çok saçma olarak görünebilir ama doğru zaman gelince anlamını kazanacaktır.
int main() {
vector<Run*> vec{ new Human, new Horse };
for (auto i : vec)
i->run();
}
Leave a Reply