(初学者)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_ptrstd::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();
}