2013-07-28 23 views
5

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

cevap

3

, kullanılacaksa ve hatta dolaylı Base için bir işaretçi Derived işaretçiyi dönüştürebilirsiniz hangi Base açık! Herhangi bir adres ayarlaması gerekiyorsa, derleyici, gömülü işaretçi, bir vtable veya herhangi bir şekilde nasıl kullanıldığını anlayacaktır: Tam yaklaşım C++ standardı tarafından yazılmamaktadır. Tam olarak ne yapılır ABI'ye bağlıdır. Örneğin, Itanium C++ ABI için sanal tablonun ofsetleri sanal tablolarda saklanır.

+0

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. –

+0

"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. –

+0

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? –

İlgili konular