(初学者)C++关于继承
(Beginner) C++ regarding inheritance
我正在尝试解决 C++ 中有关继承的问题,并想知道如何正确地进行处理。
我设置了 3 个 类:
- 敌人(具有成员数据:int Damage、int Health 和 int Level)
- 狼
- 熊
我的继承设置方式是:Wolf is-a Enemy and Bear is-a Enemy。换句话说,Wolf 和 Bear 都继承自 Enemy。
我想设置我的程序,这样当我像这样创建一个新的 Enemy 时:
Enemy anEnemy;
然后在 Enemy::Enemy() 构造函数中,它将随机决定敌人是狼还是熊。
如何解决这个问题?我知道我必须在 Enemy::Enemy() 构造函数中生成一个随机数,并根据随机数的结果将敌人变成熊或狼。但我就是想不通如何将 "turn it"(敌人)变成狼或熊。
任何帮助将不胜感激。谢谢!
要在 运行 时随机决定类型,那么为了类型安全你实际上必须使用动态分配,例如
Enemy* p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then:
delete p_enemy;
其中 random_enemy
是一个类似于
的函数
auto random_enemy()
-> Enemy*
{
return (my_random_number() > 0.5? new Wolf : new Bear);
}
然而,您会发现,手动 delete
很难在 many/most 情况下正确处理。因此,通过使用 std::unique_ptr
和 std::shared_ptr
等智能指针, 自动化 是很常见的。那么使用代码可能如下所示:
unique_ptr<Enemy> p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then it auto-deletes.
和函数类似
auto random_enemy()
-> unique_ptr<Enemy>
{
return unique_ptr<Enemy>(
my_random_number() > 0.5? new Wolf : new Bear
);
}
您现在有 2 个问题:
首先,多态性(查找)是基于引用或指针,而不是值。
因此,当你创建你的敌人(可能是熊或狼 "at random")时,你不能为它保存一个值类型的变量,因为类型不会总是相同的。
Ennemy my_ennemy = (Bear or Wolf); // This is impossible.
本质上,Bear 和 Wolf 不是同一类型,甚至大小也不相同,因此它们无法容纳在已分配的 Ennemy 大小的内存中。
你需要这些方面的东西:
Ennemy *my_ennemy = new Bear(); // OR
Bear someExistingBear;
Ennemy *my_ennemy = &someExistingBear; // Or even
std::unique_ptr<Ennemy> my_ennemy(new Bear());
相反,您必须决定是在 Ennemy 构造函数之外构建 Bear 还是 Wolf。
您可以像这样使用免费功能:
Ennemy *make_ennemy() {
// Some random way to choose. Probably with a static seed.
if (isbear)
return new Bear();
else
return new Wolf();
}
我正在尝试解决 C++ 中有关继承的问题,并想知道如何正确地进行处理。
我设置了 3 个 类: - 敌人(具有成员数据:int Damage、int Health 和 int Level) - 狼 - 熊
我的继承设置方式是:Wolf is-a Enemy and Bear is-a Enemy。换句话说,Wolf 和 Bear 都继承自 Enemy。
我想设置我的程序,这样当我像这样创建一个新的 Enemy 时:
Enemy anEnemy;
然后在 Enemy::Enemy() 构造函数中,它将随机决定敌人是狼还是熊。
如何解决这个问题?我知道我必须在 Enemy::Enemy() 构造函数中生成一个随机数,并根据随机数的结果将敌人变成熊或狼。但我就是想不通如何将 "turn it"(敌人)变成狼或熊。
任何帮助将不胜感激。谢谢!
要在 运行 时随机决定类型,那么为了类型安全你实际上必须使用动态分配,例如
Enemy* p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then:
delete p_enemy;
其中 random_enemy
是一个类似于
auto random_enemy()
-> Enemy*
{
return (my_random_number() > 0.5? new Wolf : new Bear);
}
然而,您会发现,手动 delete
很难在 many/most 情况下正确处理。因此,通过使用 std::unique_ptr
和 std::shared_ptr
等智能指针, 自动化 是很常见的。那么使用代码可能如下所示:
unique_ptr<Enemy> p_enemy = random_enemy();
// Use p_enemy here, e.g. p_enemy->make_noises(), then it auto-deletes.
和函数类似
auto random_enemy()
-> unique_ptr<Enemy>
{
return unique_ptr<Enemy>(
my_random_number() > 0.5? new Wolf : new Bear
);
}
您现在有 2 个问题:
首先,多态性(查找)是基于引用或指针,而不是值。 因此,当你创建你的敌人(可能是熊或狼 "at random")时,你不能为它保存一个值类型的变量,因为类型不会总是相同的。
Ennemy my_ennemy = (Bear or Wolf); // This is impossible.
本质上,Bear 和 Wolf 不是同一类型,甚至大小也不相同,因此它们无法容纳在已分配的 Ennemy 大小的内存中。
你需要这些方面的东西:
Ennemy *my_ennemy = new Bear(); // OR
Bear someExistingBear;
Ennemy *my_ennemy = &someExistingBear; // Or even
std::unique_ptr<Ennemy> my_ennemy(new Bear());
相反,您必须决定是在 Ennemy 构造函数之外构建 Bear 还是 Wolf。
您可以像这样使用免费功能:
Ennemy *make_ennemy() {
// Some random way to choose. Probably with a static seed.
if (isbear)
return new Bear();
else
return new Wolf();
}