因此,在我的垄断游戏中,我有基类Field
,派生类Property : public Field
和Board
,其中包含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
函数返回式返回型是正确的。