Modül dersleri (2/2)
Çok biçimlilik ve sanal işlevler
Polimorfizm, farklı türetilmiş sınıflardaki nesneleri bir işaretçi veya temel sınıflarına referans yoluyla işlememize olanak tanır ve çalışma zamanında bir yöntemin doğru sürümünün çağrılmasını sağlar (Geç Bağlama).
Sanal İşlevler: virtual ve override
Bir yöntemde polimorfizmi etkinleştirmek için, onu temel sınıf içindeki virtual anahtar sözcüğünü kullanarak bildirmemiz gerekir. Türetilmiş sınıflarda, bu yöntemi geçersiz kıldığımızı açıkça belirtmek için override belirticisini kullanırız.
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};Temel sınıfa yönelik işaretçileri kullanarak C++, çalışma zamanında doğru yöntemi çözecektir:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;Soyut Sınıflar ve Saf Sanal İşlevler
Saf sanal işlev, sonunda = 0 ile bildirilen bir sanal üye işlevidir. Resmi bir sözleşmeyi temsil eder: temel sınıf hiçbir uygulama sağlamaz ve bunu tamamen alt sınıflara devreder.
En az bir saf sanal işlev içeren sınıfa Soyut Sınıf adı verilir ve doğrudan örneklenemez.
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};Kendin dene
Animal'da 'Bazı sesler' yazdıran sanal bir makeSound() yöntemi tanımlayın. Daha sonra 'Miyav'ı yazdırmak için geçersiz kılma belirticisini kullanarak Cat sınıfında geçersiz kılın.
İpucu göster
Temel sınıf yönteminin başına "sanal" ifadesini eklemeyi ve türetilmiş sınıfta parametre parantezlerinden sonra "geçersiz kılma" ifadesini koymayı unutmayın.
3 denemeden sonra çözüm mevcut
Printable soyut sınıfı içinde void döndüren saf bir sanal print() işlevi bildirin. Ardından, Printable'dan genel olarak miras alan ve 'Baskı Belgesini' yazdırmak için print() yöntemini uygulayan Document sınıfını oluşturun.
İpucu göster
Saf bir sanal işlev, `virtual void print() = 0;` imzasıyla bildirilir. "Belge"nin, "Yazdırılabilir"den herkese açık olarak devraldığından emin olun.
3 denemeden sonra çözüm mevcut