2013-04-21 8 views
7

Soyut bir alt sınıfa sahip olduğumu varsayalım, alt ve alt sınıfları Child1 ve Child2. Eğer bir Ebeveyn * alan bir fonksiyonum varsa, bu fonksiyonun gerçekte alınıp alınmadığı Child1 * ya da Child2 * olup olmadığını belirlemek için bir yol (belki de RTTI ile?) Var mı?Temel sınıfına bir işaretçi verilen bir alt sınıfı tanımlamak ister misiniz?

Buradaki RTTI ile ilgili deneyimim, foo'nun bir Parent * olduğunda, foo'nun bir üyesi olan alt sınıftan bağımsız olarak typeid (foo) tipid (parent *) döndürdüğü olmuştur.

+2

A "Ana *" her zaman bir "Üst" *. Bu bir asla * bir Çocuk *. Sormak istediğin şey "işaret ettiği şeyin türü nedir". –

+0

Kerrek SB: Dün sana soğuk omzunu verdim, ama gerçek programlamaya gittiğimde, yorumun muhtemelen sayfadaki her şeyden daha değerliydi. Bunun için üzgünüz ... – ExOttoyuhr

cevap

5

Sen dereferenced pointer, değil işaretçi kendisinin TypeId bakmak gerekir; I.e, tipid (* foo), tipid değil (foo). Dereferged işaretçi hakkında sormak size dinamik tipini alacak; İşaretçiyi sormak, gözlemlediğiniz gibi, sadece size statik tipini verecektir.

+0

Çok sayıda alt sınıf göstergesini oluşturmaktan çok aradığım şeyle tam olarak uyuşuyormuş gibi geliyor ... – ExOttoyuhr

+0

'typeid (* foo)' sadece doğru çalışma zamanı türünü döndüreceğinden bahsetmeye değer. Ebeveyn sınıfı en az bir sanal yönteme sahipse, Child1 'yerine" Ana ". – ApproachingDarknessFish

2

Emin:

BaseClass *bptr = // whatever, pointer to base class 
SubclassOne *safe_ptr_one = dynamic_cast<SubclassOne *>(bptr); 
if (safe_ptr_one != nullptr) { 
    // Instance of SubclassOne 
} else { 
    // not an instance of SubclassOne, try the other one 
    SubclassTwo *safe_ptr_two = dynamic_cast<SubclassTwo *>(bptr); 
    if (safe_ptr_two != nullptr) { 
     // Instance of SubclassTwo 
    } else { 
     // it wasn't either one :'(
    } 
} 
+0

Nice - dynamic_cast bunu bilmiyordum! (Ama sonra, bu yüzden sordum.) – ExOttoyuhr

+0

@ExOttoyuhr Rica ederim. Ve yay, Andy Prowl'den önce bir cevap vermeyi başardım! –

5

Bunun için std::dynamic_cast kullanabilirsiniz. Eğer std::shared_ptr gibi akıllı işaretçileri kullanıyorsanız Ayrıca

Parent* ptr = new Child1(); 
if(dynamic_cast<Child1*>(ptr) != nullptr) { 
    // ptr is object of Child1 class 
} else if(dynamic_cast<Child2*>(ptr) != nullptr) { 
    // ptr is object of Child2 class 
} 

, böyle kontrol edebilirsiniz:

std::shared_ptr<Parent> ptr(new Child1()); 
if(std::dynamic_pointer_cast<Child1>(ptr) != nullptr) { 
    // ptr is object of Child1 class 
} else if(std::dynamic_pointer_cast<Child2>(ptr) != nullptr) { 
    // ptr is object of Child2 class 
}