C++ düz eski verilerinde (POD) çalışma zamanı türü bilgisi yoktur. Tanımlanan sınıflar, tam olarak 1 bayt alır ve boş bir temel sınıf optimizasyonu olan herhangi bir derleyicide aynı çalışma zamanı temsilcilerine sahiptir.
İstediğiniz gibi yapılamaz.
Temel sınıfına sanal bir yıkıcı eklemek, RTTI'ye eklenir ve dynamic_cast
desteği. Her türetilmiş sınıf için farklı bir şekilde başlatılan tabana enum
veya int
alan ekleme .
Yine bir başka seçenek şöyle bir şablon işlevi oluşturmak ve bir işaretçi saklamaktır:
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
ve daha sonra bir my_type_id
uygun başlatıldı A
depolamak. Bu RTTI'yi yeniden icat ediyor ve daha fazla özellik istedikçe C++ RTTI ek yüküne yaklaşacaksınız.
C++ 'da sadece sizin için ne istediğini ödersiniz: RTTI olmadan sınıflar isteyebilir, bunu yaptırabilir ve alabilirsiniz.
RTTI Çalıştırma Zamanı Türü Bilgileri'dir. POD düz eski veriler, bir C++ 03 terimidir. Birçok sınıf POD değildir: kolay yol virtual
destructor eklemektir. C++ 11, daha ince taneli standart düzen ve toplu şartlara sahiptir. Teknik olarak RTTI ve POD, birbirinin karşıtları değildir: PTI olmayan RTTI'si olmayan sınıflar vardır.
MSVC'nin RTTI üretmeme seçeneklerine ve saldırgan Comdat katlanmasının, her iki durumda da standardın ihlaline yol açtığı manuel RTTI'yi bozabileceğini unutmayın.
"dynamic_cast <>" soruyor musunuz? Bu, C++ 11'e özgü değil. –
Hiçbir şey değişmedi: standart C++'da yansıma yoktur. Çalışma zamanı türü bilgilerini açmak istiyorsanız, 'dynamic_cast' – quantdev
İlginizi çekebilir: http://stackoverflow.com/q/25495733/596781 –