Sınıf hiyerarşisinde "çapraz döküm" yapmak için dynamic_cast
'u kullanmak yasal olduğunu biliyorum. Ben sınıfları varsa Örneğin, bu gibi göründüğünü: Ben tip C
bir nesneye işaret ediyor bir A*
işaretçisi varsaÇapraz dönüşümün işe yarayıp yaramadığını kontrol etme?
A B
\/
C
, o zaman bir işaretçi almak için
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
kullanabilirsiniz C
'un B
temel nesnesini işaret ediyorum.
bu söz nedeni yukarıdaki kod yazmak zamanda, derleyici henüz A
ve B
görmüş olsa C
tanımını görmediği mümkün olmasıdır. Bu, derleyicinin A
ve B
arasında herhangi bir bağlantı tespit etmemesinin mümkün olduğu anlamına gelir, ancak yine de kodu derlemek zorundadır çünkü C
gibi bir sınıfın var olması ve dynamic_cast
'un bazı durumlarda başarılı olması mümkündür. Sorun şu ki, yanlış türde bir nesneyi kazara çapraz olarak çevirebileceğim anlamına gelir.
A B D
\/
C
, D
bazı rasgele ilgisiz sınıftır: Ben şuna benzer sınıfları sahip olduğunu varsayalım. A
ve D
bağlamak için hiçbir olası yolu yoktur çünkü
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
O zaman bu dynamic_cast
daima zamanında başarısız olur: Böyle bir şey yazmaya çalışırsanız. Yanlışlıkla D
kullanıyorum, çünkü B
kullanmak istediğimden derleyici, anlamsız bir döküm yapmam için bana hiçbir gösterge vermeyecektir.
Soruma ilişkin soru: Derleyicinin, alicinin çalışma zamanında her zaman başarısız olacağı konusunda beni uyarması için bir yol var mı? Bunu algılayabilen herhangi bir büyük derleyici için dil düzeyi bir çözümden veya bazı derleyici ayarlarından memnun olurum. Dış bir araç varsa, bu da iyi; Sadece bu sınıf hataları yakalamanın mümkün olup olmadığını bilmek istiyorum.
Bu kesinlikle bağlayıcı seviyesinde olmalı? Derleme zamanında, “A” ve “D” den türeyen bir sınıf oluşturulamayacağınızı bilmiyorsunuz? – Keith
@ Keith- Kesinlikle, her şeye sahip bir derleyiciniz olmadıkça. Dostum, ben bunlardan birini istiyorum ... :-) – templatetypedef
@Keith: Bağlayıcı bile cevabımda açıklandığı gibi her tür hakkında tam bilgi sahibi olmayabilir. –