2013-04-09 23 views
14

Sınıf hiyerarşisine sahip olduğumuzu söylüyor. En altta ve üstte türetilmiştir. Temel sınıf göstericisine dönüştürülse bile nesne sınıfı nasıl belirlenir.C++'da çalışma zamanında gerçek nesne türü nasıl belirlenir;

Base* b = new Derived(): 

typeid(b).name(); // i want this to tell me that this is actually derived not base object 

Dize alanı veya bu tür ve sanal alma işlevlerinin el ile uygulanması dışında herhangi bir yolu var mı?

Not: Bana, temel sınıf en az bir sanal yöntem olduğundan emin olun derleyici bağımsız çözüm

+3

Bu cevapta açıklandığı gibi mümkündür, ancak bu hemen hemen her zaman yanlış bir şeydir. Burada ne elde etmeye çalışıyorsun? –

+0

Hiçbir şey tam olarak sadece bunu tartışmanın amacı için değil :) – user1079475

+1

Daha çok uygulamaya yönelik sürüm: http://stackoverflow.com/questions/351845/finding-the-type-of-an-object-in-c || Mirastan bahsetmeyen daha genel bir sürüm: http://stackoverflow.com/questions/11310898/how-do-i-get-the-type-of-a-variable –

cevap

26

bahsediyor <typeinfo> içerir ve sadece ek bir dereferencing, typeid(*b).name() ile mevcut kodu kullanın. geçerken


, bir typeid çağrı C tek bir yerde olduğuna dikkat ++ yapabileceğiniz bir özel durum anlamına gelmektedir iyi tanımlanmış davranışı ile bir nullpointer, KQUEUE:

C++ 11 § 5.2.8/2: glvalue ekspresyonu işaretçi tekli * operatör uygulanarak elde edilir ve işaretçi boş işaretçisi değeri (4.10) ise
“, typeid sentezleme std::bad_typeid özel durum (18.7.3) . ”

+4

"En iyi" En az bir sanal yöntem " –

8

Eğer b aslında Derived işaret olmadığını bulmak yapmak isteyen tüm, sadece dynamic_cast() kullanıyorsanız: cismin gerçek zamanı tür b tarafından işaret eğer

if (dynamic_cast<Derived*>(b)) { ... } 

dynamic_cast bir boş gösterici döndürür Derived (veya Derived'dan türetilmiş bir sınıf) değildir. Bu, std::type_info'un name() üyesinin aksine, bu, derleyici değişmezdir.

Bunun yalnızca Base en az bir sanal üye işlevi varsa çalışacağını unutmayın. Zaten bir temel gösterici üzerinden türetilen türleri manipüle ettiğinden, bunun bir sanal yıkıcıya sahip olması gerekir.

+0

Ama durum, yeni bir sınıf eklediğinizde kodu modylemek istemiyorum. – user1079475

İlgili konular