2016-11-03 13 views
7

Şu an Scott Meyers 'More Effective C++' i okudum. Iyi örnek olan! Öğe 2, dynamic_cast'in sadece aşağı yayınlar için değil, aynı zamanda kardeşler için de kullanılabileceğinden bahseder. Kardeşler için herhangi bir (makul) olmayan bir kullanım örneği sunabilir mi? Bu aptal testi gerektiği gibi yazdırıyor, ancak bu tür dönüşümler için herhangi bir uygulama hayal bile edemiyorum.Kardeşlerin dynamic_konu için kullanım durumu ne olurdu?

#include <iostream> 
using namespace std; 

class B { 
public: 
    virtual ~B() {} 
}; 

class D1 : public B {}; 

class D2 : public B {}; 

int main() { 
    B* pb = new D1; 
    D2* pd2 = dynamic_cast<D2*>(pb); 
    cout << pd2 << endl; 
} 
+0

: Bir C nesneye bir A işaretçisi varsa, o zaman bu C nesneye bir B işaretçi alabilirsiniz

A B \/ C 

'Çapraz' ara. Bir sınıf, iki farklı sınıftan miras aldığında, başka bir şekilde değil (sizin sorunuzda olduğu gibi) kullanıldığında kullanılır. –

cevap

6

genellikle işaretçiler/iki sınıfın referanslar ve göstericiler arasındaki döküm için kullanılan tam olarak sidecast eşleşmiyor önerilen senaryo,/referanslar hem türemiş sınıfın bir nesne kastediyoruz iki sınıf. İşte bunun için bir örnek: Bu çapraz döküm ve sınıf iki farklı sınıflara (tam tersi değil, devraldığı zaman kullanıldığı gösterildiği gibi adlandırılır

struct Readable { 
    virtual void read() = 0; 
}; 
struct Writable { 
    virtual void write() = 0; 
}; 

struct MyClass : Readable, Writable { 
    void read() { std::cout << "read"; } 
    void write() { std::cout << "write"; } 
}; 
int main() 
{ 
    MyClass m; 
    Readable* pr = &m; 

    // sidecast to Writable* through Readable*, which points to an object of MyClass in fact 
    Writable* pw = dynamic_cast<Writable*>(pr); 
    if (pw) { 
     pw->write(); // safe to call 
    } 
} 

LIVE

2

senin soru). Aşağıdaki sınıf hiyerarşisi Verilen örnek için

:

A* ap = new C; 
B* bp = dynamic_cast<B*>(ap); 
İlgili konular