Yani sanal miras ile static_cast
kullanarak downcast imkansız, ama nasıl şu upcast yapmak mümkündür:static_cast sanal miras ile nasıl kullanılabilir?
[ derived part | base part ]
biliyorum ki upcasting kabul edilir: nesnenin
class Base {...};
class Derived : public virtual Base {...};
...
Derived *d = new Derived();
Base *b = static_cast<Base*>(d);
Bellek düzeni "güvenli", ancak derleyici, sanal devralma zamanı, derleme zamanında taban alt nesnesine olan uzaklığı nasıl bilir? static_cast
, vtable
kullanıyor mu?
class Third : public Derived {...};
...
Derived *d = new Third(); // non-virtual upcast, no offset will be added
Base *b = static_cast<Base*>(d);
aynı static_cast
çizgiyi kullanılan bu zaman, ama farklı Base
alt nesneye offset:
böyle bir şey varsa, bu özellikle kafa karıştırıcı (sanal değil dikkat edin)! Nesnenin
Bellek düzeni: o d
işaret ettiği nesnenin gerçek dinamik türüne bağlıdır eğer
[ derived part | third part | base part ]
Peki nasıl derleme zamanında belirlenebilir? Eğer durumunda bir
Derived
bir işaretçi varsa
Bu, genellikle bildiğimden, ofsetlerin vtable'da depolandığı durumdan kaynaklanır. Ancak bu, derleme zamanında statik olarak nasıl yapıldığı sorusuna cevap vermiyor. Sağladığım iki duruma bakarsanız, hangi veterinerin doğru dengeye sahip olduğu sorusunu gündeme getirir? Derleyicinin, Derived'in vtable veya Third's vtable'ına bakması gereken hangisi? Açıkça, vtables'deki 2 ofset farklıdır ve doğru vtable'ın seçilmesi d'nin çalışma zamanı tipine bağlıdır. Bu yüzden statik olarak nasıl yapıldığını anlayamıyorum. –
"static_cast" içindeki "statik", derleme zamanında yapıldığı anlamına gelmez! Bu, derleyicinin derleme zamanında bilgiyi nerede bulacağını statik olarak belirleyebileceği anlamına gelir: Örneğin, vtable'da veya tabandaki gömülü göstericinin nerede konumlandırılacağını bilir (sanal mirasa bağlı olarak) uygulanmaktadır). Bu dinamikte "class_cast" gibi bir sınıfın bir maçını aramaya gitmeyecek. –
Yani static_cast'in bunun dinamik bir yönü olduğunu söylüyorsun, anladım. Bu mantıkla, static_cast neden sanal mirasta neden düşüş yapmıyor? –