В качестве предисловия, это мой первый пост на Stack Exchange, поэтому прошу прощения, если с моим постом что-то не так, дайте мне знать.
Я также хотел бы сказать, что я новичок в C ++, мой единственный опыт работы с ним связан с классом, который я сейчас веду в своем университете. Я пытаюсь изменить код, который я написал ранее, в несколько более чистых классов и структур.
Итак, чтобы объяснить немного, я делаю проект с игрой Nine Men's Morris. У меня будет как минимум два разных типа игроков. Практически все между разными классами игроков. Единственное отличие состоит в том, как работают некоторые методы.
Из-за сходства между типами игроков я написал базовый класс Player и создал два производных класса. Базовый класс Player определяется примерно так:
Class Player {
protected:
vector<Piece> pieces_;
MillSet mill_set_;
Stats statistics_;
virtual void initialize(Player&)=0;
virtual void normal(Player&)=0;
virtual void fly(Player&)=0;
};
Существуют и другие защищенные и общедоступные методы, но это основные методы, которые будут меняться между каждым производным классом. Я не могу определить функции "virtual void" в базовом классе, поэтому я прочитал это, помечая его "= 0;" означает, что его действительно нет в базовом классе.
В любом случае, я определил один из производных классов следующим образом:
class RandomPlayer : public Player {
private:
void initialize(Player& other_player);
void normal(Player&);
void fly(Player&);
Piece& choose_to_move(Player&);
Piece& choose_to_remove(Player&);
public:
RandomPlayer() : Player() {};
};
Функции, которые принимают Player & в качестве параметра, нуждаются в доступе к нескольким защищенным членам и методам, которые определены в базовом классе. Я видел в сети, что можно использовать ссылку на базовый класс объекта. Я надеялся, что передача Player & методу производного класса позволит мне получить доступ к защищенным методам Player, но, похоже, это не так.
Что-то не так в моем подходе к этой проблеме или чего-то не хватает? Есть ли у меня способ обойти это? Я надеюсь, что вне зависимости от того, какого игрока я перейду, я смогу вызывать защищенные элементы и методы переданного типа игрока.
Я новичок в ООП, но мне нравится эта идея, и я хотел бы узнать о ней. Я пометил сообщение как «Полиморфизм», но я все еще не совсем уверен в этой идее, поэтому, пожалуйста, дайте мне знать, если это не имеет смысла в качестве тега.
Спасибо за любую помощь.