班级设计和继承问题



因此,在我的垄断游戏中,我有基类Field,派生类Property : public FieldBoard,其中包含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"; };
};

下一类是属性,它来自字段

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

in property.cpp

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";
}

现在让我们看板。H

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

及其构造函数

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

在Main中我创建了类似的东西

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

我希望它可以致电Property::showProperty(),但它调用Field::showProperty()。为什么不使用派生类功能?

因为您的指针m_board是指向Field对象数组的第一个元素。

这意味着分配 m_board[0] = test will slice Property对象。

您需要一个 pointers 的数组到 Field。例如

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

当然,请记住在数组中的指针实际上指向某个地方有效:

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

当然,您还需要修改 getField函数返回式返回型是正确的。

相关内容

  • 没有找到相关文章

最新更新