Şimdi şu ana kadar normal tekli bir şekilde kalıtım almayı gördük. Ancak şuan gördüğümüz şey her dilde izin verilen bir şey değildir. Kullandığınız dil içerisinde çoklu kalıtıma izin veriyor mu vermiyor mu bakmanız gerekiyor. C++ buna izin veriyor ancak bazı sıkıntılar yaşayabiliyorsunuz. Bunun başlıca sorunlarında Diamond Problemi gelmektedir. Bunun çözümleri var ancak çok onaylanan bir şey olmadığı için mesela C# da çoklu kalıtım yoktur.
Şimdi konuya geçelim.
class Template : public InheritanceClass{
}
Biliyorsunuz ki normal bir tane mirası bu şekilde alıyoruz. Multiple miras alırken ise şu şekilde yazıyoruz.
class Template : public InheritanceClass, public MultipleInheritance{
}
Bu şekilde birden çok sınıfı miras alan bir Template türemiş sınıfı oluşturuyoruz.
Bu ne işe yarıyor?
Şimdi kendi kod örneğimize geçelim basit bir şekilde kodlanmasını ve nasıl çalıştığını görebilmek için.
#include <iostream>
using namespace std;
class Yazici{
public :
Yazici(){
cout << "Yazici class'i methodu çalıştı." << endl;
}
};
class Tarayici{
public :
Tarayici(){
cout << "Tarayici class'i methodu çalıştı." << endl;
}
};
class YaziciVeTarayici : public Yazici, public Tarayici {
public:
YaziciVeTarayici(){
cout << "YaziciVeTarayici class'i methodu çalıştı." << endl;
}
};
int main(){
YaziciVeTarayici a;
}
Burada gördüğünüz gibi YaziciVeTarayici sınıfını ürettiğimizde Yazici ve Tarayici sınıfının default constructor çalışıcaktır. Çünkü iksinide miras olarak aldığı için böyle bir durum gerçekleşiyor.
Şimdi işleri biraz karıştıralım
#include <iostream>
using namespace std;
class Yazici{
private:
string yaziciName;
public :
Yazici(string yaziciName) : yaziciName(yaziciName){
cout << "Yazici class'i methodu çalıştı." << endl;
}
string getNameY(){return yaziciName;}
};
class Tarayici{
private :
string tarayiciName;
public :
Tarayici(string tarayiciName) : tarayiciName(tarayiciName){
cout << "Tarayici class'i methodu çalıştı." << endl;
}
string getNameT(){return tarayiciName;}
};
class YaziciVeTarayici : public Yazici, public Tarayici {
public:
YaziciVeTarayici(string n1, string n2): Tarayici(n1), Yazici(n2){
cout << "YaziciVeTarayici class'i methodu çalıştı." << endl;
}
};
int main(){
YaziciVeTarayici a("Choreme", "Vestel");
cout << "Tarayici ismi : " << a.getNameT() << "\\nYazici İsmi : " << a.getNameY() << endl;
}
Artık Yazici ve Tarayici sınıflarımızın bir üyesi var. İkisinede daha önce edindiğimiz (base class constructor call) bilgileri kullanarak atama işlemlerini yaptık. Bunları nasıl main’de kullanıcağız ?