Virtual, override ve final anahtar kelimeleri

C++ interface tanımı için özel bir sözdizimi sunmaz, bunu pure virtual fonksiyonlarla gerçekleştirir. Pure virtual fonksiyon, virtual fonksiyon deklerasyonunun sonuna ‘= 0’ eklenerek oluşturur.

Bir fonksiyonu virtual olarak tanımlamak için başına virtual anahtar kelimesi getirilir. En az bir pure virtual fonksiyona sahip sınıfa abstract sınıf denir ve nesne üretemez. Bu sınıftan türetilmiş sınıfların nesne üretebilmesi için bütün pure virtual fonksiyonlarının implemente edilemesi gerekir. Abstract sınıf private üyelere ve virtual olmayan sınıflara sahip olabilir.

class IBook {
       public:
	virtual void setName(string const&) = 0;
	virtual string& getName() = 0;
	virtual ~IBook() = default;
};

Base sınıftaki virtual fonksiyonlar için türetilmiş sınıflarda virtual anahtar kelimesini kullanmak bir zorunluluk değildir ama hiyerarşinin uzadığı sınıflarda hangi fonksiyonun virtual olduğunu bilmek zor olabilir. Bazen bu yüzden base sınıfı aramak (çoğu zaman farklı bir header dosyasında) zorunda kalabiliriz. Onun için bu fonksiyonların başına virtual, sonuna ise override getirmek en iyi uygulama kabul edilir.

class Novel final : public IBook {
       private:
	string m_name{};
	bool m_isSignedbyAuthor{};

       public:
	void setName(string const& t_name) { m_name = t_name; }
	string getName() const { return m_name; }
	bool isSignedbyAuthord() const { return m_isSignedbyAuthor; }
};

yerine

class Novel final : public IBook {
       private:
	string m_name{};
	bool m_isSignedbyAuthor{};

       public:
	virtual void setName(string const& t_name) override { m_name = t_name; }
	virtual string& getName() override { return m_name; }
	bool isSignedbyAuthord() const { return m_isSignedbyAuthor; }
};

Kalıtımın public erişim belirteciyle yapılması “is a” yani “bir tür” ilişkisini ifade eder. Yukarıdaki durumda ‘Novel is a Book’ yani ‘Roman bir tür Kitaptır’.

final anahtar kelimesi kalıtımın son basamağını belli eder ve bir sınıfa veya üye fonksiyona uygulanır.

Novel final olarak işaretlendiğinden ondan sınıf türetmeyi denemek derleme zamanı hatası oluşturur.

class CrimeNovel : public Novel {
	...
};
error: base 'Novel' is marked 'final'
 class CrimeNovel : public Novel {};

Benzer biçimde final olarak işaretlenen üye fonksiyonları türetilmiş sınıflarda override etmeyi denemek derleme zamanı hatası oluşturur.

Düzgün bir nesne yaşam döngüsü için abstract sınıfın dtor’u ya public ve virtual, ya da protected ve nonvirtual olmalıdır.


OOP

327 Words

2018-08-13 03:00 +0300