2016-11-03 23 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

「クロスキャスト」を検索します。これは、クラスが2つの異なるクラスから継承するときに使用されます(あなたの質問のように)。 –

答えて

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

それはクロスキャストと呼ばれ、あなたのようにクラスは、2つの異なるクラス(いない他の方法で回避から継承したときに、それが使用されています質問)。例えば

、次のクラス階層を与えられた:

A B 
\/
    C 

あなたはCオブジェクトへAのポインタを持っている場合は、あなたがそのCオブジェクトにBのポインタを取得することができます:

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