{"id":1762,"date":"2020-04-06T20:28:05","date_gmt":"2020-04-06T20:28:05","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=1762"},"modified":"2020-05-15T22:37:29","modified_gmt":"2020-05-15T22:37:29","slug":"polimorfizm-ve-c","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/","title":{"rendered":"Polimorfizm ve C++"},"content":{"rendered":"<p>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m bug\u00fcn sizler ile birlikte OOP&#8217;nin temel bile\u015fenlerinden biri olan polimorfizme g\u00f6z ataca\u011f\u0131z. Bu yaz\u0131 ile birlikte a\u015fa\u011f\u0131daki sorulara yan\u0131t bulaca\u011f\u0131z. Kavramlar\u0131 olabilidi\u011fince sade bir \u015fekilde aktard\u0131ktan sonra bunlar\u0131 C++ da nas\u0131l kullan\u0131ld\u0131\u011f\u0131na bak\u0131p, yine bu konu ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm noktalara da de\u011finip, konuyu kapatmay\u0131 planl\u0131yorum a\u00e7\u0131k\u00e7as\u0131. \u00d6ncelikle sorular\u0131m\u0131za bakal\u0131m:<\/p>\n<ul>\n<li>Polimorfizm (&#8220;Polymorphism&#8221;) nedir ve nesne y\u00f6nelimli yaz\u0131l\u0131m geli\u015ftirme yakla\u015f\u0131mdaki yeri nedir?<\/li>\n<li>\u00c7e\u015fitleri nelerdir? C++ da nas\u0131l kullan\u0131lmaktad\u0131r?<\/li>\n<li>C++&#8217;da sanal tablolar\u0131 (&#8220;vTables&#8221;) kullan\u0131m\u0131 nedir?<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/mdpgroup.files.wordpress.com\/2014\/11\/venn.png\" alt=\"\" width=\"584\" height=\"548\" \/><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Polimorfizm (&#8220;Polymorphism&#8221;) nedir ve nesne y\u00f6nelimli yaz\u0131l\u0131m geli\u015ftirmedeki yeri nedir?<\/strong><\/span><\/h2>\n<p>Evet, ilk olarak polimorfizm nedir sorusunun cevab\u0131na bakal\u0131m isterseniz. <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.wikiwand.com\/en\/Polymorphism_(computer_science)\">Wikipedia&#8217;dan<\/a> <\/strong><\/span>bakt\u0131\u011f\u0131m\u0131zda k\u0131saca bir t\u00fcr\u00fcn, ba\u015fka bir t\u00fcr gibi davranabilme ve bu t\u00fcr gibi kullanabilme \u00f6zelli\u011fi olarak ifade edilmi\u015f. Kelimenin kendisine bakacak olursak &#8220;Polymorphism&#8221; kelimesi asl\u0131nda &#8220;poly&#8221; ve &#8220;morphism&#8221; kelimelerinden bir araya gelmi\u015ftir. Bunlarda ilki \u00e7okluk ve ikincisi de form anlam\u0131na gelir. \u0130lk olarak 1967 y\u0131llar\u0131nda <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.wikiwand.com\/en\/Christopher_Strachey\">Christopher Strachey<\/a><\/strong><\/span> denen ki\u015fi taraf\u0131ndan ortaya at\u0131lm\u0131\u015f ve sonras\u0131nda ise <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.wikiwand.com\/en\/J._Roger_Hindley\">Hindley<\/a> <\/span><\/strong>ve <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/www.wikiwand.com\/en\/Robin_Milner\">Milner<\/a> <\/span><\/strong>taraf\u0131ndan geli\u015ftirilmi\u015ftir.<\/p>\n<p>Nesne y\u00f6nelimli programlamada ise, bu \u00f6zellik bir nesnenin, tek bir aray\u00fcze dayanmas\u0131na ve ayn\u0131 metod ismine sahip olmas\u0131na ra\u011fmen farkl\u0131 \u015fekilde davranabilmesini ifade eder. C++ a\u00e7\u0131s\u0131ndan bakacak olursak (ki buna ilerleyen ba\u015fl\u0131klarda daha detayl\u0131 bakaca\u011f\u0131z), bir s\u0131n\u0131f\u0131n \u00fcye fonksiyonu \u00e7a\u011f\u0131rd\u0131\u011f\u0131m\u0131zda, ilgili nesnenin tipine g\u00f6re, farkl\u0131 fonksiyonlar\u0131n \u00e7a\u011fr\u0131labilmesi \u015feklinde ger\u00e7eklenmektedir. Peki bu nas\u0131l olmakta? E bu kadar a\u00e7\u0131klama yeter hemen basit bir kod par\u00e7as\u0131 ile duruma m\u00fcdahale edelim \ud83d\ude42 Bunu da hayvanlar alemi \u00fczerinden yapal\u0131m.<\/p>\n<pre class=\"minimize:true lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;memory&gt;\r\nusing namespace std;\r\n\r\nclass Animal\r\n{\r\nprivate:\r\n    const string mName;\r\n\r\npublic:\r\n    Animal(const string&amp; mName) \r\n        : mName(mName) {}\r\n   \r\n    string name() const {\r\n        return mName;\r\n    }\r\n    virtual string speak() const\r\n    {\r\n      return \"Ben kimim?\";\r\n    };\r\n};\r\n\r\nclass Cat: public Animal\r\n{\r\npublic:\r\n    Cat(const string&amp; mName) \r\n        : Animal(mName) {}\r\n\r\n    virtual string speak() const override{ \r\n        return \"Miyav!\"; \r\n    }\r\n};\r\n\r\nclass Dog: public Animal\r\n{\r\npublic:\r\n   Dog(const string&amp; mName) \r\n       : Animal(mName) {}\r\n   \r\n   virtual string speak() const override{ \r\n        return \"Hav! Hav!\"; \r\n   }\r\n};\r\n\r\nvoid checkAnimals(const auto&amp; listOfAnimals)\r\n{\r\n   for(const auto animal : listOfAnimals) \r\n   {\r\n       cout &lt;&lt; animal-&gt;name() &lt;&lt; \" \" &lt;&lt; animal-&gt;speak() &lt;&lt; \" diye seslendi!\" &lt;&lt; endl; \r\n   }\r\n}\r\n\r\nint main()\r\n{\r\n    \/\/ Heyvanat bahcemizi olusturalim\r\n    vector&lt;shared_ptr&lt;Animal&gt;&gt; animalList = { make_shared&lt;Cat&gt;(\"Mirnav\"),\r\n        make_shared&lt;Dog&gt;(\"Karabas\"),\r\n        make_shared&lt;Cat&gt;(\"Tosun\") };\r\n\r\n    \/\/ Heyvanlara bir goz atalim\r\n    checkAnimals(animalList);\r\n \r\n    return 0;\r\n}<\/pre>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki \u00e7\u0131kt\u0131y\u0131 alaca\u011f\u0131z:<\/p>\n<pre class=\"lang:ps decode:true \">Mirnav Miyav! diye seslendi!\r\nKarabas Hav! Hav! diye seslendi!\r\nTosun Miyav! diye seslendi!<\/pre>\n<p>Yukar\u0131daki \u00f6rnekte g\u00f6rece\u011finiz \u00fczere asl\u0131nda b\u00fct\u00fcn s\u0131n\u0131flar tek bir aray\u00fcz olan\u00a0<em>IAnimal<\/em> aray\u00fcz\u00fcnden t\u00fcretilmekte. Fakat \u00e7al\u0131\u015fma zaman\u0131nda (ki burada main fonksiyonu i\u00e7erisinde kallavi ilklendirme oluyor \ud83d\ude42 ), olu\u015fturulan nesne tipine g\u00f6re daha sonra \u00e7al\u0131\u015fma zaman\u0131ndaki kullan\u0131m s\u0131ras\u0131nda (ki buradaki asl\u0131nda <em>checkAnimals<\/em> fonksiyonu) \u00e7a\u011fr\u0131lan fonksiyonlar\u0131n \u00e7\u0131kt\u0131s\u0131 ilgili nesneye g\u00f6re farkl\u0131l\u0131k g\u00f6steriyor. \u0130yi de bunun bize ne faydas\u0131 olacak diye d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fcz anda hemen \u015fu durumu hep birlikte ele al\u0131m. Diyelim ki, hayvanat bah\u00e7esinizi geni\u015fletmeye karar verdiniz ve yeni bir hayvan eklendi, neleri de\u011fi\u015ftirmeniz gerekecek? Asl\u0131nda yukar\u0131daki basit \u00f6rnek de bile, ilgili hayvan s\u0131n\u0131f\u0131n\u0131 ekleyip olu\u015fturduktan sonra hi\u00e7 bir \u015feyi de\u011fi\u015ftirmenize gerek kalmad\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. \u0130\u015fte temel mant\u0131k bu. Elbette bu i\u015fin bir y\u00f6n\u00fc, di\u011fer y\u00f6nlerine de hemen g\u00f6z ataca\u011f\u0131z.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>\u00c7e\u015fitleri nelerdir? C++ da nas\u0131l kullan\u0131lmaktad\u0131r?<\/strong><\/span><\/h2>\n<p>\u015eimdi art\u0131k biraz daha C++ do\u011fru gelebiliriz. Bu yaz\u0131mda Java ve benzeri dillere girmeyece\u011fim a\u011f\u0131rl\u0131\u011f\u0131 C++&#8217;a verece\u011fim ama kaynaklar k\u0131sm\u0131na bu dillere ili\u015fkin de bir ka\u00e7 sayfa koyaca\u011f\u0131m. Evet dostlar, C++ da polimorfizm kullan\u0131m\u0131na ili\u015fkin bir \u00f6rne\u011fi ilk ba\u015fl\u0131kta g\u00f6rd\u00fck. Bu asl\u0131nda C++&#8217;\u0131n \u00e7al\u0131\u015fma zaman\u0131nda bunu nas\u0131l ger\u00e7ekle\u015ftirdi\u011fi ile ilgiliydi buna benzer \u015fekilde derleme zaman\u0131nda da bu kabiliyet sunulmakta. Detaylar\u0131na ge\u00e7meden \u00f6nce, C++&#8217;da bulunan polimorfizm mekanizmalar\u0131na g\u00f6z atal\u0131m. Bunlar\u0131 a\u015fa\u011f\u0131daki fig\u00fcrde g\u00f6rebilirsiniz:<\/p>\n<p id=\"ifZZohf\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1772 aligncenter\" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8a05c2a0db9.png\" alt=\"\" width=\"604\" height=\"337\" \/><\/p>\n<p>\u015eimdi bu mekanizmalara daha yak\u0131ndan bakal\u0131m.<\/p>\n<h3><strong>\u00c7al\u0131\u015fma Zaman\u0131nda Polimorfizm<\/strong><\/h3>\n<p>\u00c7al\u0131\u015fma zaman\u0131 polimorfizmi, kimi kaynaklarda dinamik polimorfizm olarak da ge\u00e7er, temel olarak ilk \u00f6rnekte de g\u00f6sterildi\u011fi \u00fczere fonksiyon \u00fczerine bindirmesi (&#8220;<em>function overriding<\/em>&#8220;) ile ger\u00e7ekle\u015ftirilmektedir. Bu da t\u00fcretilmi\u015f s\u0131n\u0131f\u0131n, t\u00fcretildi\u011fi s\u0131n\u0131fta bulunan \u00fcye bir fonksiyona yeni bir tan\u0131m getirerek, bu fonksiyonun \u00fczerine bindirmesi (&#8220;<em>overriding<\/em>&#8220;) ile ger\u00e7ekle\u015fir (evet t\u00fcrk\u00e7e kar\u015f\u0131l\u0131\u011f\u0131na al\u0131\u015fmak biraz vakit alabilir). Burada dinamik polimorfizmi ger\u00e7ekle\u015ftirmek i\u00e7in &#8220;<em>virtual<\/em>&#8221; anahtar kelimesini kullan\u0131yoruz, bu sayede derleyici, kullan\u0131lan i\u015faret\u00e7inin tipinden ziyade, i\u00e7erisinde g\u00f6sterilen nesnenin tipine bakar ve bu sayede ilgili hayvan\u0131n metodu \u00e7a\u011fr\u0131l\u0131r. Velev ki <em>virtual<\/em> koymad\u0131k ne olur? Hemen yukar\u0131daki \u00f6rne\u011fi <em>virtual<\/em> ve <em>override<\/em> anahtar kelimelerini kald\u0131rarak \u00e7al\u0131\u015ft\u0131ral\u0131m ve \u00e7\u0131kt\u0131ya bakal\u0131m:<\/p>\n<pre class=\"lang:ps decode:true\">Mirnav Ben kimim? diye seslendi!\r\nKarabas Ben kimim? diye seslendi!\r\nTosun Ben kimim? diye seslendi!<\/pre>\n<p>G\u00f6rmek istedi\u011fimiz elbette bu de\u011fildi. C++&#8217;da bu i\u015fin kotar\u0131lmas\u0131nda sanal fonksiyonlar rol oynamakta. Derleyici i\u00e7in bu anhatar kelime, i\u015faret\u00e7inin i\u00e7eri\u011fine bakmas\u0131 i\u00e7in gerekli uyar\u0131y\u0131 veriyor. Bu noktada asl\u0131nda sanal fonksiyonlar\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan da haberdar olman\u0131n \u00f6nemli oldu\u011funu d\u00fc\u015f\u00fcn\u00fcyorum, o sebeple bu konuyu ayr\u0131 bir ba\u015fl\u0131kta daha detayl\u0131 olarak ele alaca\u011f\u0131m.<\/p>\n<p>Sonu\u00e7 olarak \u00e7al\u0131\u015fma zaman\u0131nda ger\u00e7ekle\u015ftirilen bu polimorfizm i\u00e7in \u015funlar\u0131 ak\u0131lda tutmakta fayda var:<\/p>\n<ul>\n<li><strong>Ba\u011flama<\/strong> (&#8220;<em>Binding<\/em>&#8220;) <strong>\u00e7al\u0131\u015fma<\/strong> zaman\u0131nda yap\u0131l\u0131r,<\/li>\n<li><strong>Sanal fonksiyonlar<\/strong> ve <strong>i\u015faret\u00e7iler<\/strong> kullan\u0131larak ger\u00e7ekle\u015ftirilir,<\/li>\n<li>Bu mekanizma ile <strong>dinamik<\/strong> (&#8220;<em>dynamic<\/em>&#8220;) ve <strong>ge\u00e7<\/strong> (&#8220;<em>late<\/em>&#8220;) <strong>ba\u011flama<\/strong> ger\u00e7eklenir,<\/li>\n<li>Bu polimorfizm mekanizmas\u0131nda, \u00e7a\u011fr\u0131 derleyici taraf\u0131ndan <strong>\u00e7\u00f6z\u00fclmez<\/strong>,<\/li>\n<li>T\u00fcretilen ve t\u00fcretilmi\u015f s\u0131n\u0131flar aras\u0131ndaki polimorfizm i\u00e7in <strong>metot<\/strong> ve <strong>parametreler<\/strong> <strong>ayn\u0131<\/strong> <strong>olmal\u0131d\u0131r<\/strong> (fonksiyon imzalar\u0131),<\/li>\n<li>Statik polimorfizme g\u00f6re, <strong>g\u00f6rece yava\u015ft\u0131r<\/strong>,<\/li>\n<li>\u00c7al\u0131\u015fma zaman\u0131nda \u00e7\u00f6z\u00fcmleme yap\u0131lmas\u0131ndan \u00f6t\u00fcr\u00fc, <strong>daha fazla esneklik<\/strong> sunar.<\/li>\n<\/ul>\n<h3><strong>Derleme Zaman\u0131nda Polimorfizm<\/strong><\/h3>\n<p>C++ da derleme zaman\u0131nda polimorfizm iki \u015fekilde yap\u0131lmakta bunlardan ilk fonksiyonlar, di\u011feri de operat\u00f6rler kullan\u0131larak ger\u00e7ekle\u015ftirilmekte. \u015eimdi bunlara s\u0131rayla bakal\u0131m.<\/p>\n<p>Fonksiyon \u00e7oklama temelde ayn\u0131 isim ve d\u00f6n\u00fc\u015f de\u011ferine sahip fakat farkl\u0131 say\u0131da, tipte parametre alma ve bunlar\u0131n farkl\u0131 s\u0131ralanmalar\u0131 ile ger\u00e7ekle\u015ftirilir. \u00c7ok basit bir \u00f6rnek vermek gerekirse:<\/p>\n<pre class=\"minimize:true lang:c++ decode:true\">#include&lt;iostream&gt;\r\nusing namespace std;\r\n \r\nclass Adder\r\n{\r\npublic:\r\n    \/\/ \u0130ki tam say\u0131 alan toplay\u0131c\u0131\r\n    int addNumbers(int x, int y) {\r\n        return (x+y);\r\n    }\r\n    \r\n    \/\/ \u00dc\u00e7 tam say\u0131 alan toplay\u0131c\u0131\r\n    int addNumbers(int x, int y, int z) {\r\n        return (x+y+z);\r\n    }\r\n    \r\n    \/\/ Bir tam say\u0131 ve bir de ondal\u0131kl\u0131 alan toplay\u0131c\u0131\r\n    int addNumbers(int x, float y) {\r\n        return (x+y);\r\n    }\r\n    \r\n    \/\/ Farkl\u0131 s\u0131rad, bir tam say\u0131 ve bir de ondal\u0131kl\u0131 alan toplay\u0131c\u0131\r\n    int addNumbers(float x, int y) {\r\n        return (x+y);\r\n    }\r\n};\r\n \r\nint main()\r\n{\r\n    Adder adderInst;\r\n    cout &lt;&lt; adderInst.addNumbers(10, 20) &lt;&lt; endl \/\/ Ilk metod cagrildi\r\n         &lt;&lt; adderInst.addNumbers(10, 20, 30) &lt;&lt; endl \/\/ ikinci metot cagrildi\r\n         &lt;&lt; adderInst.addNumbers(10, 20.0F) &lt;&lt; endl \/\/ ucuncu metot cagrildi\r\n         &lt;&lt; adderInst.addNumbers(20.0F, 10) &lt;&lt; endl; \/\/ dorduncu metot cagrildi\r\n         \r\n    return 0;    \r\n}<\/pre>\n<p>\u00c7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda elde edece\u011finiz \u00e7\u0131kt\u0131:<\/p>\n<pre class=\"lang:ps decode:true\">30\r\n60\r\n30\r\n30<\/pre>\n<p>Fonksiyon \u00e7oklamas\u0131na benzer \u015fekilde C++&#8217;da belirli operat\u00f6rleri de yukar\u0131dakine benzer \u015fekilde, temel ya da karma\u015f\u0131k tipler i\u00e7in \u00e7oklayabilirsiniz. \u00d6rne\u011fin, &#8220;+&#8221; opera\u00f6t\u00fcr\u00fcn\u00fc string s\u0131n\u0131flar\u0131 i\u00e7in, metinleri birle\u015ftirme amac\u0131 ile \u00e7oklayabilirsiniz ya da kompleks say\u0131lar i\u00e7in toplamada kullanabilirsiniz. Buna ili\u015fkin de hemen bir \u00f6rne\u011fe g\u00f6z atal\u0131m:<\/p>\n<pre class=\"minimize:true lang:c++ decode:true \">#include&lt;iostream&gt; \r\nusing namespace std; \r\n\r\nclass Complex \r\n{ \r\nprivate: \r\n\tint mReal, mImag; \r\npublic: \r\n\tComplex(int r = 0, int i = 0)\r\n\t : mReal{r}, mImag{i}\r\n\t {\r\n\t }\r\n\t\r\n\t\/\/ Asagidaki metot iki Complex nesnesi ile + operatoru kullanildiginda\r\n\t\/\/ otomatik sekilde cagrilacaktir\r\n\tComplex operator + (Complex const &amp;obj) { \r\n\t\tComplex res; \r\n\t\tres.mReal = mReal + obj.mReal; \r\n\t\tres.mImag = mImag + obj.mImag; \r\n\t\treturn res; \r\n\t} \r\n\tvoid print() { \r\n\t    cout &lt;&lt; mReal &lt;&lt; \" + i\" &lt;&lt; mImag &lt;&lt; endl; \r\n\t} \r\n}; \r\n\r\nint main() \r\n{ \r\n\tComplex c1(10, 5), c2(2, 4); \r\n\tComplex c3 = c1 + c2; \r\n\tc3.print(); \r\n\t\r\n\treturn 0;\r\n}<\/pre>\n<p>\u00c7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda elde edece\u011finiz \u00e7\u0131kt\u0131:<\/p>\n<pre class=\"lang:ps decode:true\">12 + i9<\/pre>\n<p>Yukar\u0131daki \u00f6rneklerden de anla\u015f\u0131laca\u011f\u0131 \u00fczere burada hangi fonksiyonlar\u0131n \u00e7a\u011fr\u0131laca\u011f\u0131n\u0131 asl\u0131nda derleyici, derleme zaman\u0131nda biliyor ve ona g\u00f6re kodu \u00fcretiyor. \u015eimdi gelelim derleme zaman\u0131nda ger\u00e7ekle\u015ftirilen bu polimorfizm i\u00e7in akl\u0131m\u0131zda tutmam\u0131z gerekenlere:<\/p>\n<ul>\n<li>Hangi metodun \u00e7a\u011fr\u0131laca\u011f\u0131 <strong>derleme zaman\u0131nda, derleyici<\/strong> taraf\u0131ndan belirlenir,<\/li>\n<li><strong>Fonksyion<\/strong> ve <strong>operat\u00f6r \u00e7oklama<\/strong> kullan\u0131larak ger\u00e7ekle\u015ftirilir,<\/li>\n<li>Bu mekanizma ile <strong>statik<\/strong> (&#8220;<em>static<\/em>&#8220;)\u00a0 ve\u00a0 <strong>erken<\/strong>(&#8220;<em>early<\/em>&#8220;) ba\u011flama ger\u00e7eklenir,<\/li>\n<li>Bu polimorfizm mekanizmas\u0131nda, \u00e7a\u011fr\u0131 <strong>derleyici<\/strong> taraf\u0131ndan <strong>\u00e7\u00f6z\u00fcl\u00fcr<\/strong>,<\/li>\n<li><strong>Ayn\u0131 s\u0131n\u0131f<\/strong> i\u00e7erisinde, <strong>ayn\u0131 isme<\/strong> sahip, fakat <strong>farkl\u0131 tipte<\/strong> veya <strong>say\u0131da<\/strong> parametrelerin kullan\u0131lmas\u0131 ile ger\u00e7ekle\u015ftirilir,<\/li>\n<li>Dinamik polimorfizme g\u00f6re, g\u00f6rece <strong>h\u0131zl\u0131d\u0131r<\/strong>,<\/li>\n<li>Derleme zaman\u0131nda \u00e7\u00f6z\u00fcmleme yap\u0131lmas\u0131ndan \u00f6t\u00fcr\u00fc,<strong> daha az esneklik<\/strong> sunar.<\/li>\n<\/ul>\n<h2><span style=\"color: #0000ff;\"><strong>C++&#8217;da sanal tablolar\u0131 (&#8220;vTables&#8221;) kullan\u0131m\u0131 nedir?<\/strong><\/span><\/h2>\n<p>\u015eimdi geldik biraz daha teknik bir konuya. Asl\u0131nda yukar\u0131da anlat\u0131lan \u00e7al\u0131\u015fma zaman\u0131ndaki polimorfizmin C++ da ger\u00e7eklenmesindeki en b\u00fcy\u00fck rol sanal fonksiyonlarda. Eminim merakl\u0131 yaz\u0131l\u0131mperver dostlar\u0131m, hayatlar\u0131nda bir noktada a\u015fa\u011f\u0131daki kodlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131klar\u0131nda ortaya \u00e7\u0131kan fark\u0131 merak edip bu yap\u0131lara ula\u015fm\u0131\u015flard\u0131r. Asl\u0131na bakarsan\u0131z, benim de m\u00fclakatlarda arada sordu\u011fum sorulardand\u0131r \ud83d\ude42<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\nusing namespace std;\r\n\r\nclass ClassA\r\n{\r\nprivate:\r\n    int a;\r\n    int b;\r\n};\r\n\r\nclass ClassB\r\n{\r\nprivate:\r\n    int a;\r\n    int b;\r\npublic:\r\n   virtual void dummyFunction() {\r\n   }\r\n};\r\n\r\nint main()\r\n{\r\n    \/\/ Bu fark neden olaki? :)\r\n    cout &lt;&lt; sizeof(ClassA) &lt;&lt; \" vs \" &lt;&lt; sizeof(ClassB) &lt;&lt; endl;\r\n         \r\n    return 0;    \r\n}<\/pre>\n<p>\u00c7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda elde edece\u011finiz \u00e7\u0131kt\u0131:<\/p>\n<pre class=\"lang:ps decode:true \">8 vs 16<\/pre>\n<p>Sanal fonksiyonlar\u0131n da \u00e7al\u0131\u015fmas\u0131n\u0131n arkas\u0131nda yatan mekanizma ise vtables olarak da bilinen sanal tablolardad\u0131r &#8220;<em>virtual tables<\/em>&#8220;. Haydi \u015fimdi bunlara yak\u0131ndan bir g\u00f6z atal\u0131m ne dersiniz. Peki nedir bu <em>vTable<\/em>&#8216;lar? <strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Virtual_method_table\">Wikipedia<\/a> <\/span><\/strong>ne der bakal\u0131m:<\/p>\n<blockquote><p>A virtual method table (VMT),\u2026, is a mechanism used in a programming language to support dynamic dispatch.<\/p><\/blockquote>\n<p>K\u0131saca, \u00e7al\u0131\u015fma zaman\u0131nda polmorfizm kapsam\u0131nda, ilgili nesneye ili\u015fkin do\u011fru fonksiyonun se\u00e7ilmesinde kullan\u0131lan tablodur. Peki normalde bu i\u015f nas\u0131l yap\u0131lmakta, hemen bakal\u0131m (asl\u0131nda yukar\u0131da biraz buna de\u011finmi\u015f olduk ama biraz daha basit bir \u00f6rnek \u00fczerinden gidelim):<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\nusing namespace std;\r\n\r\nclass Base\r\n{\r\npublic:\r\n void func1(){\r\n    cout &lt;&lt; \"[Base::func1()] Kardes bu Base sinif!\" &lt;&lt; endl;\r\n }\r\n};<\/pre>\n<p>Derleyici yukar\u0131da tan\u0131mlam\u0131\u015f oldu\u011fumuz <em>Base<\/em> s\u0131n\u0131f\u0131m\u0131zda bulunan <em>func1<\/em>()&#8217;\u0131 olu\u015fturacak ve bunun adresini hat\u0131rlayacak ve her <em>Base<\/em> s\u0131n\u0131f nesnesinde ayn\u0131 kod par\u00e7as\u0131 \u00e7a\u011f\u0131l\u0131yor olacak, yani belirsiz bir durum yok ve \u00e7al\u0131\u015fma zaman\u0131 i\u00e7in herhangi bir s\u0131k\u0131nt\u0131. \u015eimdi ortam\u0131 biraz daha renklendirelim \ud83d\ude42 mesela ortama bir ka\u00e7 sanal fonksiyon ve dahi t\u00fcretilmi\u015f bir s\u0131n\u0131f ekleyelim:<\/p>\n<pre class=\"lang:c++ decode:true\">#include &lt;iostream&gt;\r\n#include &lt;memory&gt; \r\nusing namespace std;\r\n\r\nclass Base\r\n{\r\npublic:\r\n  virtual void func1(){\r\n    cout &lt;&lt; \"[Base::func1] Kardes bu Base sinif!\" &lt;&lt; endl;\r\n }\r\n  virtual void func2(){\r\n    cout &lt;&lt; \"[Base::func2] Kardes bu Base sinif!\" &lt;&lt; endl;\r\n }\r\n};\r\n\r\nclass Derived :\r\n   public Base \r\n{\r\npublic:\r\n  void func1() override{\r\n    cout &lt;&lt; \"[Derived::func1] Kardes bu Derived sinifi!\" &lt;&lt; endl;\r\n  }\r\n};\r\n\r\nint main()\r\n{\r\n   auto instance = make_shared&lt;Derived&gt;();\r\n   instance-&gt;func1();\r\n\r\n   return 0;\r\n}<\/pre>\n<p>Bu durumda e\u011fer <em>Base<\/em> s\u0131n\u0131ftaki <em>virtual<\/em> anahtar kelimeleri silersek asl\u0131nda yine bir \u00f6nceki \u00f6rnekte oldu\u011fu gibi Base s\u0131n\u0131f\u0131n\u0131n fonksiyonu \u00e7a\u011fr\u0131l\u0131yor olacakt\u0131 ama burada durum farkl\u0131. Burada, \u00e7al\u0131\u015fma zaman\u0131nda uygun fonksiyon se\u00e7ilerek \u00e7a\u011fr\u0131l\u0131yor olmas\u0131 gerekiyor. \u015eimdi ad\u0131m ad\u0131m bunlar\u0131n nas\u0131l ger\u00e7ekle\u015ftirildi\u011fine bakal\u0131m:<\/p>\n<ul>\n<li>Ne zaman ki s\u0131n\u0131f\u0131n\u0131zda bir sanal fonksiyon tan\u0131mlad\u0131\u011f\u0131n\u0131zda, derleyici s\u0131n\u0131f i\u00e7erisinde bir <em>sanal tablo (<\/em>bundan sonra <em>vTable<\/em> diyece\u011fim<em>)\u00a0<\/em>olu\u015fturur. Ayn\u0131 zamanda t\u00fcretilen s\u0131n\u0131flar i\u00e7erisinde de ayr\u0131ca bir <em>vTable<\/em> bulunmakta. Yukar\u0131daki boyuttaki fark da bundan kaynaklan\u0131yor bu arada,<\/li>\n<li>S\u0131n\u0131fa ait b\u00fct\u00fcn nesneler ayn\u0131 <em>vTable<\/em>&#8216;\u0131 payla\u015f\u0131r,<\/li>\n<li><em>vtable<\/em> i\u00e7erisinde, s\u0131n\u0131f i\u00e7erisindeki her bir sanal fonksiyon i\u00e7in bir kalem tutulur ve burada ilgili fonksiyonun en spesifik hali tutulur (\u00f6rnek <em>Derived::func1<\/em>()). Yukar\u0131daki \u00f6rnek i\u00e7in a\u015fa\u011f\u0131daki gibi <em>vTable<\/em>&#8216;lar olu\u015fturulur:\n<ul>\n<li><\/li>\n<li><img loading=\"lazy\" decoding=\"async\" width=\"453\" height=\"270\" class=\"size-full wp-image-1777 aligncenter\" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3.png 453w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3-300x179.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3-150x89.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3-400x238.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8134393b3-200x119.png 200w\" sizes=\"auto, (max-width: 453px) 100vw, 453px\" \/><\/li>\n<li><\/li>\n<\/ul>\n<\/li>\n<li>\u015eimdi bu tablolar\u0131 inceleyecek olursak.\n<ul>\n<li><em>Base<\/em> s\u0131n\u0131f\u0131na ait <em>vTable<\/em> i\u00e7erisinde iki adet girdi var bunlar bu s\u0131n\u0131f i\u00e7erisinde tan\u0131mlanm\u0131\u015f olan func1() ve func2() fonksiyonlar\u0131. Burada, iki fonksiyon da kendilerini i\u015faret etmekte \u00e7\u00fcnk\u00fc, <em>Base<\/em> s\u0131n\u0131f g\u00f6z\u00fcnden, bu fonksiyonlar\u0131n en spesifik halleri bunlar<\/li>\n<li>Gelelim <em>Derived<\/em> s\u0131n\u0131f\u0131na ait <em>vTable&#8217;a<\/em>. Burada <em>func1<\/em>(), <em>Derived<\/em> s\u0131n\u0131f\u0131na ait ilgili fonksiyonu i\u015faret etmekte. \u00c7\u00fcnk\u00fc bu s\u0131n\u0131f <em>Base<\/em> s\u0131n\u0131ftaki ilgili fonksiyondan daha spesifik. Fakat, <em>func2<\/em>()&#8217;ye bakt\u0131\u011f\u0131m\u0131zda, bu fonksiyona ili\u015fkin girdi, <em>Derived<\/em> de\u011fil de, Base s\u0131n\u0131f\u0131na ait <em>func2<\/em>() fonksiyonunu i\u015faret etmekte, \u00e7\u00fcnk\u00fc Derived i\u00e7erisindeki <em>func2<\/em>() ilgili fonksiyonun \u00fczerine bindirme <strong>yapm\u0131yor<\/strong>. Bu durumda en spesifik hali <em>Base<\/em> s\u0131n\u0131f\u0131nki oluyor,<\/li>\n<\/ul>\n<\/li>\n<li>Derleyici, bu tablolar i\u00e7in her bir s\u0131n\u0131fa, bu tabloya olan bir i\u015faret\u00e7i ekler ve tahmin edebilece\u011finiz \u00fczere \u00e7al\u0131\u015fma zaman\u0131nda da bu tabloya g\u00f6re do\u011fru fonksiyon se\u00e7ilerek \u00e7a\u011fr\u0131l\u0131r. Yani nihayetinde s\u0131n\u0131flar a\u015fa\u011f\u0131daki hali al\u0131rlar:<\/li>\n<li>\n<p id=\"LCHRCrt\"><img loading=\"lazy\" decoding=\"async\" width=\"988\" height=\"412\" class=\"size-full wp-image-1779 aligncenter\" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506.png 988w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-300x125.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-768x320.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-500x209.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-150x63.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-400x167.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-800x334.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2020\/04\/img_5e8b8a4b10506-200x83.png 200w\" sizes=\"auto, (max-width: 988px) 100vw, 988px\" \/><\/p>\n<\/li>\n<\/ul>\n<p>Polimorfizm a\u00e7\u0131s\u0131ndan, <em>vTable&#8217;a<\/em> ili\u015fkin yukar\u0131daki a\u00e7\u0131klamalar umar\u0131m yeterli olmu\u015ftur. Elbette C++ i\u00e7in b\u00fct\u00fcn hikaye bu de\u011fil ama bundan sonraki mecra biraz daha teknik detaylara giriyor ki a\u00e7\u0131k\u00e7as\u0131 burada oraya dalma niyetim yok ama k\u0131saca bahsedeyim. Bir sonraki ad\u0131m asl\u0131nda &#8220;Multiple Inheritance&#8221;, yani \u00e7oklu miras. Bu durumda ise birden fazla s\u0131n\u0131ftan t\u00fcretilen s\u0131n\u0131f i\u00e7in birden fazla <em>vTable<\/em> ihtiyac\u0131 olabilir. Hatta miras da ortak atadan gelen s\u0131n\u0131flardan t\u00fcretilme durumlar\u0131nda, daha da fazla <em>vTable<\/em> ihitiyac\u0131 olabilmektedir.<\/p>\n<p><em>vTable&#8217;lara<\/em> ili\u015fkin daha detayl\u0131 bilgi ve bir ka\u00e7 kod par\u00e7as\u0131 i\u00e7in kaynaklar k\u0131sm\u0131na bir ka\u00e7 kaynak ekliyorum. Merakl\u0131 yaz\u0131l\u0131mperver dostlar bir g\u00f6z atabilirsiniz.<\/p>\n<p>Evet dostlar bir yaz\u0131m\u0131n daha sonuna geldik. Umar\u0131m yaz\u0131, C++&#8217;da polimorfizm ve genel olarak polimorfizm konular\u0131na a\u00e7\u0131kl\u0131k getirmi\u015ftir.<\/p>\n<p>Bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle. Bol kodlu ve sa\u011fl\u0131kl\u0131 g\u00fcnler diliyorum \ud83d\ude42<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/www.javatpoint.com\/runtime-polymorphism-in-java\"><span style=\"color: #008000;\"><strong>https:\/\/www.javatpoint.com\/runtime-polymorphism-in-java<\/strong><\/span><\/a><\/li>\n<li><a href=\"https:\/\/www.learncpp.com\/cpp-tutorial\/125-the-virtual-table\"><span style=\"color: #008000;\"><strong>https:\/\/www.learncpp.com\/cpp-tutorial\/125-the-virtual-table<\/strong><\/span><\/a><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/ww2.ii.uj.edu.pl\/~kapela\/pn\/cpp_vtable.html\">https:\/\/ww2.ii.uj.edu.pl\/~kapela\/pn\/cpp_vtable.html\u00a0<\/a><\/strong><\/span><\/li>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/www.quora.com\/What-are-vTable-and-VPTR-in-C++\">https:\/\/www.quora.com\/What-are-vTable-and-VPTR-in-C++<\/a><\/strong><\/span><\/li>\n<\/ul>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m bug\u00fcn sizler ile birlikte OOP&#8217;nin temel bile\u015fenlerinden biri olan polimorfizme g\u00f6z ataca\u011f\u0131z. Bu yaz\u0131 ile birlikte a\u015fa\u011f\u0131daki sorulara yan\u0131t bulaca\u011f\u0131z. Kavramlar\u0131 olabilidi\u011fince sade bir \u015fekilde aktard\u0131ktan sonra bunlar\u0131 C++ da nas\u0131l kullan\u0131ld\u0131\u011f\u0131na bak\u0131p, yine bu konu ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm noktalara da de\u011finip, konuyu kapatmay\u0131 planl\u0131yorum a\u00e7\u0131k\u00e7as\u0131. \u00d6ncelikle sorular\u0131m\u0131za bakal\u0131m: Polimorfizm&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,188],"tags":[13,708,703,704,709,710,705,700,441,711,699,698,707,706,701,702],"class_list":["post-1762","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c","category-modern-c","category-yazilim-muhendisligi","tag-c","tag-compile-time-polymorphism","tag-dynamic-polymorphism","tag-early-binding","tag-function-overloading","tag-function-overriding","tag-late-binding","tag-nesne-yonelimli-programlama","tag-oop","tag-operator-overloading","tag-polimorfizm","tag-polymorphism","tag-runtime-polymorphism","tag-static-polymorphism","tag-virtual-functions","tag-vtable"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Polimorfizm ve C++ - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[:tr]Polimorfizm ve C++[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m bug\u00fcn sizler ile birlikte OOP&#8217;nin temel bile\u015fenlerinden biri olan polimorfizme g\u00f6z ataca\u011f\u0131z. Bu yaz\u0131 ile birlikte a\u015fa\u011f\u0131daki sorulara yan\u0131t bulaca\u011f\u0131z. Kavramlar\u0131 olabilidi\u011fince sade bir \u015fekilde aktard\u0131ktan sonra bunlar\u0131 C++ da nas\u0131l kullan\u0131ld\u0131\u011f\u0131na bak\u0131p, yine bu konu ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm noktalara da de\u011finip, konuyu kapatmay\u0131 planl\u0131yorum a\u00e7\u0131k\u00e7as\u0131. \u00d6ncelikle sorular\u0131m\u0131za bakal\u0131m: Polimorfizm... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2020-04-06T20:28:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-15T22:37:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png\" \/>\n\t<meta property=\"og:image:width\" content=\"32\" \/>\n\t<meta property=\"og:image:height\" content=\"32\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"Polimorfizm ve C++\",\"datePublished\":\"2020-04-06T20:28:05+00:00\",\"dateModified\":\"2020-05-15T22:37:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\"},\"wordCount\":2096,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"c++\",\"compile time polymorphism\",\"dynamic polymorphism\",\"early binding\",\"function overloading\",\"function overriding\",\"late binding\",\"nesne y\u00f6nelimli programlama\",\"OOP\",\"operator overloading\",\"polimorfizm\",\"Polymorphism\",\"runtime polymorphism\",\"static polymorphism\",\"virtual functions\",\"vtable\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\",\"name\":\"[:tr]Polimorfizm ve C++[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2020-04-06T20:28:05+00:00\",\"dateModified\":\"2020-05-15T22:37:29+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Polimorfizm ve C++\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[:tr]Polimorfizm ve C++[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/","og_locale":"tr_TR","og_type":"article","og_title":"[:tr]Polimorfizm ve C++[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m bug\u00fcn sizler ile birlikte OOP&#8217;nin temel bile\u015fenlerinden biri olan polimorfizme g\u00f6z ataca\u011f\u0131z. Bu yaz\u0131 ile birlikte a\u015fa\u011f\u0131daki sorulara yan\u0131t bulaca\u011f\u0131z. Kavramlar\u0131 olabilidi\u011fince sade bir \u015fekilde aktard\u0131ktan sonra bunlar\u0131 C++ da nas\u0131l kullan\u0131ld\u0131\u011f\u0131na bak\u0131p, yine bu konu ile ilintili oldu\u011funu d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm noktalara da de\u011finip, konuyu kapatmay\u0131 planl\u0131yorum a\u00e7\u0131k\u00e7as\u0131. \u00d6ncelikle sorular\u0131m\u0131za bakal\u0131m: Polimorfizm... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2020-04-06T20:28:05+00:00","article_modified_time":"2020-05-15T22:37:29+00:00","og_image":[{"width":32,"height":32,"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2017\/12\/FeaturedImage-e1580417052514.png","type":"image\/png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"Polimorfizm ve C++","datePublished":"2020-04-06T20:28:05+00:00","dateModified":"2020-05-15T22:37:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/"},"wordCount":2096,"commentCount":0,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["c++","compile time polymorphism","dynamic polymorphism","early binding","function overloading","function overriding","late binding","nesne y\u00f6nelimli programlama","OOP","operator overloading","polimorfizm","Polymorphism","runtime polymorphism","static polymorphism","virtual functions","vtable"],"articleSection":["C++","Modern C++","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/","name":"[:tr]Polimorfizm ve C++[:] - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2020-04-06T20:28:05+00:00","dateModified":"2020-05-15T22:37:29+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2020\/04\/06\/polimorfizm-ve-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"Polimorfizm ve C++"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1762","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=1762"}],"version-history":[{"count":17,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1762\/revisions"}],"predecessor-version":[{"id":1848,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/1762\/revisions\/1848"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media\/174"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=1762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=1762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=1762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}