gpt4 book ai didi

c++ - 在派生类的基类构造函数中使用重写函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:14:04 25 4
gpt4 key购买 nike

我是 C++ 编程的新手,所以我想编写一些简单的代码来熟悉语法。我暂时故意忽略了指针和引用。

在编码过程中,我正在练习继承,我想创建一个代表一手牌的 Hand 类。基类有一个名为 update() 的函数,用于在构造时初始化“total”和“notation”属性。此外,可以使用 add() 函数将卡片添加到手中,该函数将卡片添加到手中并触发 update() 以适本地更新属性。

#include<vector>

class Hand
{
public:
std::vector<int> cards;
int total;
std::string notation; // Abbreviated notation of the object
// Constructor
Hand(std::vector<int> cards);
void update();
void add(int card);
}

Hand::Hand(std::vector<int> cards)
{
this->cards = cards;
update();
}

void Hand::update()
{
total = 0;
notation += "{ ";
for (int card: cards)
{
total += card;
notation += std::to_string(card) + " ";
}
notation += "}";
}

void Hand::add(int card)
{
cards.push_back(card);
update();
}

接下来,我想创建一个更具体的 Hand 类,称为 StandHand,它执行与 Hand 相同的所有操作,但它还有一个变量,该变量会在总数达到特定值时发生变化。

起初我以为我可以像下面这样写子类,但是唉。

class StandHand : public Hand
{
public:
int stand;
StandHand(std::vector<int> cards, int stand);
void update();
}

StandHand::StandHand(std::vector<int> cards, int stand) : Hand(cards)
{
this->stand = stand;
updateHand();
}

void StandHand::update()
{
Hand::update();
notation += stand <= total ? " (stand)" : "";
}

但是当我在 StandHand 对象上调用 add() 方法时,它不使用 StandHand::update() 方法,而是使用基本的 update() 方法。如何确保 add() 方法在 Hand 的子类中使用时使用该子类的 update() 函数?

最佳答案

对于初学者来说,代码中没有重载函数。派生类中update的声明隐藏了基类中同名函数的声明。

由于成员函数 add 是在基类中声明的,因此函数 update 的名称也在基类中搜索。

将函数 update 声明为虚函数。

class Hand
{
public:
// ...
virtual void update();
};

class StandHand : public Hand
{
public:
// ///
void update() override;
};

关于c++ - 在派生类的基类构造函数中使用重写函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com