2017-12-06 21 views
0

私のモノポリーゲームで私はベースクラスFieldを持っています。クラスデザインと継承の問題

class Field { 
protected: 
    int m_position; 
public: 
    Field() { } 
    Field(int p_position) : m_position(p_position) { } 
    virtual void showProperty() const { std::cout << "Actuall output"; }; 
}; 

次のクラスがproperty.cppにフィールド

class Property : public Field { 
    float m_price; 
public: 
    Property(int, float); 
    void showProperty() const; 
}; 

から派生したプロパティです

Property::Property(int p_position, float p_price) : Field(p_position), m_price(p_price) { } 

void Property::showProperty() const { 
    std::cout << 
     "Position: " << m_position << "\n" << 
     "Price: " << std::to_string(m_price) << "\n"; 
} 

は今board.h

constexpr int BOARD_SIZE = 40; 

class Board { 
    std::unique_ptr<Field[]> m_board; 
public: 
    Board(); 
    Field getField(int index) { return m_board[index]; } 
}; 

とそのコンストラクタを見ることができます

0メインで
Board::Board() { 
    m_board = std::make_unique<Field[]>(BOARD_SIZE); 
    Property test(1, 100); 
    m_board[0] = test; 
} 

私はこの

int main() {  
    Board newBoard; 
    newBoard.getField(0).showProperty(); 
} 

のようなものを作成して、私はそれがProperty::showProperty()を呼び出すことを期待するが、それはField::showProperty()を呼び出します。なぜ派生クラス関数を使用していないのですか?

答えて

0

ポインタm_boardは、Fieldオブジェクトの配列の最初の要素へのポインタです。

つまり、m_board[0] = testスライスPropertyオブジェクトに割り当てられます。

ポインタの配列Fieldが必要です。たとえばもちろん

std::array<Field*, BOARD_SIZE> m_board; 

、配列内のポインタが実際に有効などこかにポイントにするために覚えている:

m_board[0] = new Property(1, 100); 

そしてまた、もちろん、あなたが正しいことをgetField関数の戻り値型を変更する必要があります。