Class 设计和继承问题

Class design and inheritance issue

所以在我的大富翁游戏中,我有基础 class Field、派生 class 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 是 属性 派生自 Field

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

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

现在让我们看看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]; }
};

及其构造函数

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()。为什么不使用派生的 class 函数?

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

这意味着赋值 m_board[0] = test 切片 Property 对象。

您需要 个指向 Field 指针数组。例如

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

当然,记得让数组中的指针真正指向某个有效的地方:

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

当然,您还需要修改 getField 函数 return 类型以使其正确。