2017-03-20 4 views
1

私はベースクラスAと派生クラスBを持っています。ベースクラスにキャストされたC++

class A { 
public: 
    int x; 
    virtual int getX() { 
     return x; 
    } 
}; 

class B : public A { 
public: 
    int y; 
}; 

バーチャルファンクションは多態性にするためのものです。 次は私がAのリスト宣言年代のが、B入れ年代内側:

vector<A> list; 
B b1,b2; 
b1.y = 2; 
b2.x = 10; 

list.push_back(b1); 
list.push_back(b2); 

は、今私は、ベクトルのすべての要素を越えると(のみB年代が持っている)yメンバーにアクセスしたい:

このコードは、実行時エラーです。どのように私はキャストとアクセスyを行うことができます任意のアイデア?

+0

あなたがすることはできませんがあります:ランタイム多型は、ポインタまたは参照

もう一つの重要な事柄を使用する必要があります。オブジェクトスライス(http://stackoverflow.com/questions/274626/what-is-object-slicing)が何であるかを見てください。 –

答えて

1

何が起こっているかは、object sliceです。あなたが探しているものを達成する

一つの方法は次のとおりです。このサンプルコードで

#include <vector> 
#include <iostream> 

using namespace std; 

class A { 
    public: 
    int x; 
    virtual int getX() { 
     return x; 
    } 

    virtual ~A() = default; 
}; 

class B : public A { 
    public: 
    int y; 
}; 

int main() { 
    vector<A*> list; 
    B b1,b2; 
    b1.y = 2; 
    b2.x = 10; 

    list.push_back(&b1); 
    list.push_back(&b2); 

    for (auto it = list.begin(); it != list.end(); ++it) { 
    B* cast = dynamic_cast<B*>(*it); 
    int value = cast->y; 
    std::cout << value << std::endl; 
    } 

    return 0; 
} 

、我々は、オブジェクトのスライスを避けるために、ポインタを使用しています。 cdhowieで述べたように
:クラス階層を作成するときに、必ず基底クラスのデストラクタを仮想にするか、メモリの問題

+3

関連ポイント:ランタイムポリモーフィズム*は、ポインタまたは参照の使用を必要とします。実行時に値を多形にすることはできません。 – cdhowie

関連する問題