- Virtual Function ✅
- vTable ve vPointer ✅
- Memory Leaks ✅
- Trim strings ✅
Virtual Function, konsept olarak object-oriented programming prensibi olan polymorphism'in bir parçasıdır. C++'ta virtual function, örnek olarak, bir ana sınıf olsun bir de bu sınıftan türetilmiş bir alt sınıf olsun. Ana sınıfta virtual olarak yazılmış foo() fonksiyonu ile türetilmiş sınıfta yazılmış foo() fonksiyonu olsun, ancak yaptığı işler farklı.
Ana sınıf tipinde bir parametreye argüman olarak
türetilmiş sınıf nesnesi gönderilirse,
türetilmiş sınıf nesnesinin foo() fonksiyonu çalıştırılacaktır. Virtual function farkını burada belli ediyor. Yani her türetilmiş sınıf için farklı bir fonksiyon yazmak yerine tek bir fonksiyon yeterli olmaktadır.
#include <iostream>
class Car{
public:
virtual void noise() {std::cout << "Bon bon bon";}
};
class Tesla: public Car{
public:
void noise() {std::cout << "Hann hannn hann"; }
};
void func(Car *foo) { foo->noise(); }
int main(){
Car *car= new Car;
Tesla *tesla = new Tesla;
//car->noise();
//tesla->noise();
func(car);
func(tesla);
return 0;
}
Virtual function neden kullanılıyor, daha iyi anlamak için buradaki
bağlantı açıklayıcı olacaktır.
vTable ve vPointer, daha yeni duydum böyle bir şey olduğunu 👏. Ama anladığım kadarıyla isteğe bağlı bir konu.
Burada öyle diyor. İlk olarak vTable nedir? virtual function kullanan her sınıf ya da bu sınıflardan türetilmiş sınıfların kendisine ait bir virtual table'ı vardır. Bu vTable içerisinde o sınıfa ait
virtual fonksiyonlar yer almaktadır. Her oluşturulan nesneninde bir vPointer'ı vardır. Bunlar ait oldukları vTable'ı işaret ederler. Aşağıdaki kodu inceleyelim:
struct Flower {
virtual void color(){}
virtual void smell(){ std::cout << "it smell like flower" << std::endl;}
void photosynthesis(){}
};
struct Daisy : public Flower {
void smell(){ std::cout << "it smells like daisy :d" << std::endl; }
};
struct Rose : public Flower {
void smell(){ std::cout << "it smells like rose" << std::endl; }
void color(){ }
};
struct Violet : public Flower {
void smell() { std::cout << "it smells like violet" << std::endl; }
};
Bu konuda ayrıntılı bilgi için
bağlantı.
Memory leaks, dinamik bellek kullanımından dolayı meydana gelen bir ciddi sorundur. Aslında sonrasında yapılması gereken işlem ayrılan hafızanın işletim sistemine iade edilmesi gerekliliğidir. Eğer bu işlem ihmal edilirse hafıza dolacaktır. Hafıza ayrılan bir pointer, delete ile silinirse bu sorunun önüne geçilmiş olur. Aksi takdirde geri dönülmesi zor durumlar meydana getirebilir.
Trim Strings, karakter dizinlerini düzenleme veya kaba tabirle budamak olarak düşünülebilir. Bunun için standart bir yöntem olmamakla beraber oldukça fazla seçenek vardır. Kendi trim fonksiyonlarınızı yazabileceğiniz gibi bu farklı seçenekler de kullanılabilir. Örnek bir trim fonksiyon işlemi, karakter dizinindeki tüm boşlukları silmek veya kaldırmak. Bu
bağlantıda çeşitli yöntemler verilmiş.
Devamını Oku »