从基类构造函数构造派生类对象

时间:2017-01-22 13:14:24

标签: c++ class inheritance constructor

基本上,我希望能够做到的就是......

说我有这个:

class Enemy
{
public:
    Enemy();
    virtual ~Enemy();
};

class Ghost: public Enemy
{

};

class Orc: public Enemy
{

};

我希望能够根据一些随机数创建Ghost或Orc。我是否必须获取随机数并创建一个开关/案例来创建我想要的对象,或者有没有办法从基类创建派生类对象?

快速说明:我只是一个爱好编码器而且经验很少。我从书本和YouTube上自学了我所知道的一切;怜悯

2 个答案:

答案 0 :(得分:1)

您不能使用基类中的ctor来构建子对象,因为按照定义构造函数只初始化当前类的字段。

您可以在基类中使用静态工厂方法,但由于C++ object slicing工厂方法无法返回Enemy - 我这样做,您将只获得原始Enemy从创建的子类对象复制公共字段。一种更自觉的方式是返回一个指向新创建对象的指针,或者更好的智能指针:

class Enemy
{
public:
    Enemy();
    virtual ~Enemy();

    static std::unique_ptr<Enemy> build_enemy() {
        // get random number in choice
        Enemy * enemy;
        switch (choice) {
            case 0: enemy = new Ghost(); break;
            default: enemy = new Orc(); break;
        }
        return std::unique_ptr(enemy);
    }
};

如果出于任何原因,您可以在交换机中使用函数数组,可以在这里轻松使用它们:

class Enemy
{
public:
    Enemy();
    virtual ~Enemy();

    static unique_ptr<Enemy> build_enemy();
private:
    typedef Enemy* (*Builder)();
    static Enemy* buildGhost();
    static Enemy* buildOrc();
    static Builder builder[];
};

class Ghost: public Enemy
{

};

class Orc: public Enemy
{

};

Enemy* Enemy::buildGhost() {
    return new Ghost();
}
Enemy* Enemy::buildOrc() {
    return new Orc();
}

std::unique_ptr<Enemy> Enemy::build_enemy() {
    // get random choice
    Enemy *enemy = (builder[choice])();
    return std::unique_ptr<enemy>;
}

Enemy::Builder Enemy::builder[] = { Enemy::buildGhost, Enemy::buildOrc };

答案 1 :(得分:0)

你可以做到这两点,你可以创建一个指向基类对象的指针向量 std::vector<std::unique_ptr<Enemy>> v;

然后根据随机数

向其添加派生类对象
switch(number)
{
    case 1:
       v.emplace_back(new Ghost());
       break;
    case 2:
       v.emplace_back(new Orc());
       break;
}