Class 设计和继承问题
Class design and inheritance issue
所以在我的大富翁游戏中,我有基础 class Field
、派生 class 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 是 属性 派生自 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 类型以使其正确。
所以在我的大富翁游戏中,我有基础 class Field
、派生 class 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 是 属性 派生自 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 类型以使其正确。