(初学者)关于继承的C ++

时间:2015-03-16 23:39:35

标签: c++ inheritance

我正在尝试用C ++解决有关继承的问题,并想知道如何正确地进行。

我设置了3个班级:   - 敌人(有成员数据:int Damage,int Health和int Level)  - 狼   - 熊

我的遗产建立的方式是:狼是 - 敌人,熊是 - 敌人。换句话说,狼和熊都继承了敌人。

我想设置我的程序,以便在我创建一个新的敌人时:

Enemy anEnemy; 

然后在Enemy :: Enemy()构造函数中,它会随机决定敌人是狼还是熊。

如何解决这个问题?我知道我必须在Enemy :: Enemy()构造函数中生成一个随机数,并根据随机数的结果将敌人变成熊或狼。但我无法绕过如何“把它”(敌人)变成狼或熊的方式。

任何帮助都会非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

要在运行时随机决定类型,那么对于类型安全,您几乎必须使用动态分配,例如

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很难正确。因此,通过使用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
        );
}

答案 1 :(得分:1)

你现在有2个问题:

首先,多态(查找)基于引用或指针,而不是值。 因此,当你创建你的Ennemy(可能是熊或狼&#34;随机&#34;)时,你不能保存一个值类型的变量,因为类型不会总是相同的。< / p>

Ennemy my_ennemy = (Bear or Wolf); // This is impossible.

基本上熊和狼不是同一类型,甚至不是相同的大小,所以它们不适合分配的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();
}