2016-10-24 3 views
1

データが派生クラスへのポインタであるマップへの参照を渡すことができるのだろうか?データが派生クラスへのポインタであるマップへの参照を渡すことはできますか?

q.cc: q.cc:34:エラー:タイプの参照の無効初期設定から '&をmapB_t' INTメイン() '関数で

#include <map> 

    class B { 

    public: 

    private: 
    int x_; 
    }; 

    class D : public B { 

    public: 

    private: 
    int y_; 
    }; 

    typedef std::map<int, B*> mapB_t; 
    typedef std::map<int, D*> mapD_t; 

    void foo(mapB_t& inmap) { 
    ; 
    } 

    int main() { 
    mapB_t mapB; 
    mapD_t mapD; 

    mapB[0] = new B; 
    mapD[0] = new D; 

    foo(mapB); 
    foo(mapD); 

    return 0; 
    } 

私はこのコンパイラエラーを表示しますタイプの式「map​​D_t」 q.cc:22:エラー:

+1

コンパイラエラーは、あなたがこれを行うことはできません良い指標です。 – juanchopanza

+0

多形性が 'D'型オブジェクトを' B& '型参照に渡すことを許しても、' mapB_t'と 'mapD_t'は継承関係を持たないという説明があるはずです。したがって、 'mapB_t&'は 'mapD_t'を受け付けません。 –

+4

起こりうることを考えてみましょう。 'inmap [0] = new B;'は災害になります。 – molbdnilo

答えて

1

「を、ボイドのfoo(mapB_t &」)の引数に1を通過する際に、私は説明が多型が可能にもかかわらず、1がD型オブジェクトを渡すことであるべきだと思いますB&型参照番号mapB_tmapD_tには継承関係がありません。したがってmapB_t&mapD_tを受け付けません。あなたの状況で多形性を使用する正しい方法は、BDタイプの多くのオブジェクトを作成することですが、常にmapB_tのタイプにマップを定義することがあります。 B*タイプポインターは、BまたはDのいずれかを指すことができます。 Bの中で少なくともvirtual関数を定義して、関数fooB*ポインタが指すオブジェクトがBまたはDであるかどうかを知ることができるようにする必要があります。ここでは、コードです:

class B{ 
    private: 
     int x_; 
    public: 
     virtual ~B(){}  // Only for telling the identity of an object 
    }; 
    class D: public B{ 
    private: 
     int y_;   // Virtual destructor gets automatically inherited 
    }; 

マップで見つかったオブジェクトがdynamic_castを使用してタイプBまたはDのであれば、機能fooを伝えることができます。ここでは、コードがあります:

void foo(std::map<int,B*> inmap){ 
    std::map<int,B*>::iterator it=inmap.find([Something]); 
    D *pd=dynamic_cast<D*>(it->second); 
    if(pd!=nullptr){ 
     // You know it->second is pointing to an object of type D 
    } 
    else{ 
     // Just an ordinary type B 
    } 
    } 

あなたはこの問題を行うことができます場合は、多型のより良い理解を持っています:https://www.hackerrank.com/challenges/magic-spells

関連する問題