‫Bu derste, C++'da sanal yöntem hakkında konuşacağız.
‫Daha önce gördük, kullandık ama tam olarak anladık mı?
‫Bakalım.
‫Yani sanal yöntem fikri, bir temel sınıftaki işlevleri geçersiz kılmamıza izin vermesidir.
‫Bunu Unreal'da begin, play ve tic gibi şeylerde gördük, ancak bunu daha ayrıntılı inceleyelim ve neden sanal
‫olarak işaretlendiklerini anlayalım.
‫Bu temel sınıftaki işlevselliği değiştirmemize olanak tanır ve bunun gerçekte ne anlama geldiğini ve sanal yöntemlerin
‫neden C++'da C Sharp gibi diğer birçok dilde olduğu gibi varsayılan işlevsellik olmadığını
‫anlamak için birazdan bahsedeceğimiz Dinamik Gönderim adı verilen bir şey yapar.
‫Şimdi şuna bir göz atalım.
‫Bunu CPP dot S-H web sitesinde yapacağım, böylece burada Unreal'da hiç bulunmayacağız.
‫Bu dil özelliğini ve nasıl çalıştığını anlayabilmeniz için sadece ham C++ işlevselliğine
‫bakıyoruz.
‫Şimdi, burada yapacağım ilk şey, devam etmek ve ana yöntemi temizlemek.
‫Kullanım örneğimizde, silahlar için bir sınıf düşüneceğiz, çünkü bu oyunlar için çok yaygın bir
‫kullanım alanıdır.
‫Oldukça basit bir şekilde it gun adında bir sınıfa bakalım ve bu sınıfın gövdesinin public
‫olmasını ve bir void shoot metodu olmasını sağlayalım.
‫Ve işleri çok basit tutmak için bu çekim yönteminin gövdesini tam burada sırayla beyan
‫edeceğim.
‫Bu arada, bunu daha önce görmediyseniz yapabilirsiniz, ancak genel olarak konuşursak, işleri ayrı tutmak,
‫derleme sürelerini daha hızlı hale getirmek vb. için işleri ayrı bir C++ dosyasında yapmak isteriz.
‫Ancak burada sadece bir oyuncak örneği olduğu için bu iyi, bu yüzden bir STD C çıkışı yapacağız.
‫Yani C++'ı çıktı dizesi olarak kullanacağız ve bu yöntemi çağırdığımızda temel olarak patlayacağız ve sonra satırı
‫sonlandıracağız.
‫Ve bu onların çekim yönteminin gövdesi.
‫Ve sınıfı küme parantezi ve noktalı virgülle tamamlayabiliriz.
‫Şimdi devam edelim ve bu sınıfı gerçekten kullanalım.
‫main'de bir silahım değişkeni oluşturacağım ve silahıma nokta atışı diyeceğim ve burada her şeyin olması gerektiği gibi
‫çalışıp çalışmadığını görelim.
‫Çalıştır düğmesine bas ve bam.
‫Beklediğimiz gibi yöntemi çağırıyor.
‫Şimdi silahımı uzatmak ve belki bir tüfek veya tabanca yapmak istersem ne olur?
‫Buna tabanca diyelim.
‫Yani pistol sınıfı, gun sınıfından miras alınmıştır ve bu şekilde çalışır.
‫Ve eğer bunu daha önce görmediyseniz, çünkü muhtemelen bunu daha önce yazmamışsınızdır, diğer
‫sınıfların gun'dan miras aldığınızı görebilmesi için guns'dan public bir miras alırsınız.
‫Ve sonra genel bölümde, tabanca için bu işlevi geçersiz kılan kendi ateş etme yöntemimizi oluşturmak
‫istiyoruz.
‫Ve burada sonunda patlama yazdırmak yerine hap yazdırmak istiyoruz çünkü bu daha küçük bir silah, daha küçük
‫bir ses çıkarıyor ve bu da bizim ateş etme yöntemimiz.
‫Dersi burada bitirelim.
‫Ve yapmak istediğimiz şey kendimize bir tabanca yaratmak.
‫Yani tabancamı buradaki ana yöntemle ateşleyin.
‫Ve bunlar sadece burada, ana yöntemde mevcut olduğu için, onlara işaretçi kullanmıyoruz.
‫Bu yüzden burada ok yerine atış operatörünü kullanıyoruz.
‫Yani tabancam ateş etmiyor.
‫Bakalım bu ne yapacak.
‫PPU yazdırmasını bekleyeceğim, ki yazdırıyor.
‫Güzel.
‫Tamam, o zaman çağıran yöntemlerimizi kaldıralım.
‫Doğrudan bunların üzerine ateş edin ve bir işaretçi ile işlerin nasıl davranacağını görelim.
‫Bu yüzden Gun adında bir silah işaretçisi oluşturacağım.
‫Peter.
‫Ve bir sonraki satırda bunu aynı satırda yapabilirim.
‫Ancak basitlik adına, bunu bir sonraki satırda yapacağım.
‫Bu silah işaretçisini, operatörün adresi olan silahım değişkeninin adresini gösterecek
‫şekilde ayarlayacağım.
‫Ve sonra bu bir işaretçi olduğu için, shoot yöntemini çağırmak için ok operatörünü kullanmamız gerekir.
‫Bu yüzden silahıma ateş et diyeceğim, çalıştır'a tıklayalım ve sonuç olarak patlama elde edelim.
‫Güzel.
‫Şimdi aynı şeyi ben yaparsam ne olur?
‫Ancak silah işaretçisini tabancamı gösterecek şekilde ayarlamak yerine, tabancamı gösterecek şekilde ayarladım.
‫Devam edelim ve şimdi koşalım.
‫Tamam.
‫Bu ilginç bir davranış.
‫Burada olan şey, her iki durumda da bu ilk yöntemi çağırıyor olmasıdır.
‫Peki bu ikinci çekim yöntemi neden çağrılmadı?
‫Burada işaretçi olarak bir tabancamız var.
‫Sanal bir yönteminiz yoksa, C++ varsayılan olarak işaretçinizin türünü kullanacaktır,
‫ki bu bir gun işaretçisidir.
‫Çağrılacak yöntemi bulmak için bu türü kullanacağını unutmayın.
‫Böylece pistol'daki geçersiz kılınan yöntem yerine gidip en üstteki bu ateş etme yöntemini çağıracaktır.
‫pistol'daki geçersiz kılınmış ve yöntemi çağırması için, pistol türünde bir göstericiye
‫sahip olması gerekir.
‫İşte bu iyi.
‫Ve bunu neden yaptıklarını anlayabilirsiniz.
‫Verimlilik için.
‫C++ tamamen verimlilikle ilgilidir.
‫Eğer bir şey derlendiğinde ya da çalıştığında daha pahalıya mal olacaksa, siz istemediğiniz sürece C++ bunu varsayılan
‫olarak yapmayacaktır.
‫Bu nedenle, C++'ın araması ve "Bu bir silah işaretçisi, bu yüzden bu silah işaretçisi yöntemini çağıracağım"
‫demesi çok kolaydır.
‫İşte bu noktada Dinamik Sevkiyat devreye giriyor.
‫Bu süslü terim temelde bunu yapmasını istemediğimiz anlamına gelir.
‫Yapmasını istediğimiz şey, "Bir saniye, bu silah işaretçisinde aslında ne saklanıyor?" demek.
‫Oradaki gerçek tip nedir?
‫Ve fark ettiğimiz gerçek tip, bunun bir tabanca tipi olduğudur.
‫Bu yüzden kendimize şu soruyu sormalıyız: Bu tür için geçersiz kılınan bir yöntem var mı?
‫Ve evet, var.
‫Peki, C++'a biraz daha az verimli olma iznini nasıl verebiliriz ve bu işaretçi türünü değiştirmek zorunda kalmadan
‫geçersiz kılma yeteneğini bize nasıl verebiliriz, ki bu her zaman mümkün olmayabilir.
‫Aslında, kendi özel aktör sınıfınız olduğunda olduğu gibi, birçok durumda bu mümkün
‫değildir.
‫Unreal, her yeni sınıf eklediğinizde tüm motoru değiştirmelerini gerektirecek özel hareket sınıfınıza
‫işaret edecek bir işaretçiye sahip değildir.
‫Hayır, bu mümkün değil.
‫Aktör yıldız türünde bir şeye işaret ediyorlar.
‫Yani oyuna başla dedikleri zaman, oyuna başlama yönteminizi çağırmasını istersiniz.
‫Yani sanal olmak zorunda.
‫Ve buradaki kilit nokta da budur.
‫Ana sınıftaki yöntemin önüne virtual eklersek, bu artık C++'a bir saniye bekleyin, eğer silah göstericisi
‫türünde bir göstericiye ateş et diyorsam, bunun örneğin bir tabanca olmadığını ve bu ateş et yönteminin
‫geçersiz kılındığını kontrol etmem gerekir.
‫Şimdi devam edip çalıştır düğmesine basarsak, patlama ve ardından hap elde ettiğimizi görebilirsiniz.
‫Yani Dinamik Sevkiyat ile beklediğimiz gibi çalışıyor.
‫Ve bu, temelde sadece işaretçide gerçekten ne tür bir tipin tutulduğunu kontrol etmek ve ilgili yöntemi çağırmak
‫anlamına gelen bu şey için kullanılan terimdir.
‫Şimdi, sıklıkla kullanıldığını göreceğiniz fazladan küçük bir sözdizimi vardır ve bu da override anahtar sözcüğüdür.
‫Ve bunu sanal olarak geçersiz kılmaya çalıştığınız bir yöntemden sonra koyarsınız.
‫Ve temel olarak geçersiz kılma anahtar sözcüğü kesinlikle gerekli değildir, ayrıca bir silahın alt sınıfındaki bir şeye karşı sanal
‫tekrar koymak da gerekli değildir.
‫Yani sanal koymak zorunda değilsiniz, ama bunu yapmaktan zarar gelmez.
‫Ancak geçersiz kılma özellikle yararlıdır çünkü isimlendirmemizi doğru yaptığımızdan emin olmamızı sağlar.
‫Yani çalıştır düğmesine basarsam, geçersiz kılma olduğunda her şey eskisi gibi çalışıyor.
‫Ancak bu yöntemin adını yanlışlıkla yanlış anladığımı ve bu yüzden geçersiz kılma işlemini yapmadığımı varsayalım.
‫Ve ben buna çekim yok demiştim.
‫Örneğin, ismi yanlış kopyalamışım.
‫Kopyalamak yerine yazdım.
‫Şimdi çalıştır düğmesine basarsam, görüyorsunuz, yine aynı hatayı alıyoruz çünkü ateş etmeye çağırmaya çalışıyoruz.
‫Bunu yanlışlıkla geçersiz kıldık.
‫Bam, bam.
‫Yani bundan kaçınmanın yolu, "Bir şeyi geçersiz kılmaya çalışıyorum" demek.
‫Bu yüzden override anahtar sözcüğümü buraya koydum ve şimdi derlemeye çalışırsam, shooter'ın override olarak işaretlendiğini
‫söylediğini görebilirsiniz, ancak override edebileceğim bir yöntem, sanal bir yöntem yok, bu durumda, Oh evet, bunu
‫yanlış yazmışım diyebilirim.
‫Bu yüzden devam edip kodumu düzelteceğim ve tekrar çekim yapacağım.
‫Ve şimdi istediğim gibi çalışıyor.
‫Dolayısıyla, bu geçersiz kılmayı oraya koyarak ve anında bunu yaparak sadece biraz ekstra güvenlik sağlar.
‫Ayrıca, geçersiz kılmaya çalıştığımız şeyin sanal olmaması durumuna karşı da bizi korur.
‫Bunu yapmayı denediğimde, geçersiz kılma olarak işaretlendiğini söylediğini görebilirsiniz,
‫ancak geçersiz kılmaz çünkü bu üst sınıfın shoot için sanal bir işlevi yoktur.
‫Umarım bu size C++'ın sanal fonksiyonları nasıl kullandığı ve uyguladığı ve neden onlar hakkında bu kadar açık olmamız gerektiği
‫hakkında genel bir bakış açısı kazandırmıştır.
‫Şimdi genel olarak sanal fonksiyonlar için bazı kullanım durumlarını düşünelim.
‫Motordan bazılarını zaten gördük.
‫Sanalın daha önce nerede kullanıldığını gördünüz?
‫Nerede kullandığınızı hayal edebiliyor musunuz?
‫Az önce bir silahınız ve bunun farklı şekillerde ateş eden farklı geçersiz kılmalarının olabileceği
‫bir kullanım örneği gördük.
‫Bu iki soruya bir yanıt düşündüğünüzde, üst sınıflardaki işlevselliği geçersiz kılan sanal işlevleri kullanmayı
‫başka nasıl hayal edebilirsiniz?
‫Gidin ve bu dersteki tartışmaların bağlantısını takip edin ve cevabınızı oraya gönderin.
‫Kullanım durumları ve bunları daha önce kullandığınız yerler ve diğer insanların neler bulduğunu görün.
‫Belki bu, sanal yöntemler konusundaki anlayışınızı sağlamlaştırmanıza yardımcı olur.
‫Bu ders için bu kadar.
‫Sanal yöntemleri öfkeyle kullanacağımız bir sonraki bölümde görüşmek üzere.