2016-11-03 6 views
7

저는 Scott Meyers의보다 효과적인 C++을 읽고 있습니다. 수정 중! 항목 2는 dynamic_cast가 다운 캐스트뿐만 아니라 형제 캐스트에도 사용될 수 있다고 언급합니다. 형제 자매를위한 (합리적으로) 인위적인 예를 제공 할 수 있습니까? 이 어리석은 시험은 0을 인쇄하지만, 그러한 변환을위한 응용 프로그램을 상상할 수는 없습니다.형제의 dynamic_cast의 유스 케이스는 무엇입니까?

#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

: 당신이 C 객체에 A 포인터가있는 경우에, 당신은 그 C 개체에 B 포인터를 얻을 수 있습니다

A B \/ C 

'크로스 캐스트'를 검색합니다. 클래스가 두 개의 다른 클래스에서 상속 받았을 때 사용됩니다 (질문에서와 같이). –

답변

6

일반적으로 포인터/두 클래스의 참조 및 포인터 사이의 주조에 사용되는 정확하게 sidecast 일치하지 않는 제안 시나리오는,/참조 모두에서 파생 클래스의 객체를 참조하는 2 개의 클래스. 여기에 대한 예 : 그것은 크로스 캐스트 및 클래스는 두 개의 서로 다른 클래스 (다른 방법은 주위에, 상속 때 사용되는 같이이라고

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

당신의 문제). 다음 클래스 계층 구조 주어진 예를 들어

:

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