c++ - (初学者)C++关于继承

标签 c++ 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() 构造函数中生成一个随机数,并根据随机数的结果将敌人变成熊或狼。但我就是想不通如何将它(敌人)“变成狼或熊”。

任何帮助将不胜感激。谢谢!

最佳答案

要在运行时随机决定类型,然后为了类型安全,您实际上必须使用动态分配,例如

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);
}

然而,正如您会发现的那样,在许多/大多数情况下,手动删除 很难做到正确。因此,通常通过使用 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
        );
}

关于c++ - (初学者)C++关于继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29088854/

相关文章:

c++ - `std::string` 是否在内部将其字符存储为签名字符?

c++ - 相互比较文本文件的元素

ruby - Ruby 中的动态继承

c++ - 派生类返回分配的基类实例

c++ - 包括模块防护装置

java - 继承概念中的传递性

python - 检查 type() 并更改 str() 或 int()

java - 为什么在父方法中返回子类名?

c++ - 当继承只为某些最终类型引入先决条件时如何记录/断言

c++ - 从一个不再存在的函数创建的 lambda 的内部框架修改 via 闭包中的变量是否安全