Alıntı (hsencan):
> bu konuyla alakasız umarım yeni konu açmam gerekmiyordur.
Gerek değil tabii ama her bağımsız konu kendi konusunda olsa çok daha iyi olur. (Yeni konu masrafı sıfır. :) )
Alıntı:
> "Derived" classına ait gösterici ile cast ettiğimiz zaman "foo2()" fonksiyonu çalışıyor.
Sistem dili olduğundan böyle işlemlere izin verilir. Bu tür dönüşümünün doğru olduğu bütünüyle programcının sorumluluğundadır. Yani, öyle diyorsan öyledir. :) Ek bilgi olarak, C++ programcıları C tür dönüşümü işlecinden kaçınırlar çünkü o hiçbir garanti vermez. Duruma göre kısıtlama getiren ve programcıyı bazı yanlışlardan koruyan ve isteneni açıkça belirten static_cast, dynamic_cast, const_cast, ve reinterpret_cast işleçlerinden birisini yeğlerler.
Alıntı:
> Bildiğim kadarı ile "foo2()" için bellekte alan ayrılmadı
Söylediğin, foo2 üye değişken olsaydı anlamlıdır. Yoksa üye işlevler için her nesne için zaten yer ayrılmaz. foo2 derlenir ve programın belleğinde bir yerde durur. Her foo2 çağrısı o adresteki işlemleri işletir.
Alıntı:
> ama çalıştırabildik.
foo2 üye değişken olsaydı "erişebildik ve değerini değiştirebildik" diyebilirdir ve o zaman daha şaşırtıcı olurdu.
Alıntı:
> Bunun sebebi nedir ?
Bu, tanımsız davranışın (undefined behavior) bir örneği. Dil, böyle bir işlemde ne olacağını tanımlamaz. Yani, örneğin "program göçer", "sigortası atar", "belleğin rasgele bir yeri kullanılır" vs. demez. Tanımsız davranışın bir sonucu, programın doğruymuş gibi çalışmasıdır. Örneğin, foo2 değişken olsaydı, nesnenin hemen yakınındaki ilgisiz baytlar kullanılırdı ve bu hata belki de senelerce hiç farkedilmeden ve hiç zarara yol açmadan gizli kalırdı. Sonra ilgisiz bir işlem daha eklendiğinde program göçebilirdi.
Alıntı:
> Ve bu Upcasting ve Downcasting işleminde bellek farklı bir yol mu izliyor ?
Olan tek şey, derleyiciye "bana inan, bu bir Derived'dır" diyorsun ve o da sana izin veriyor. :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]