复制-构造子到父类型指针

时间:2019-04-27 19:41:08

标签: c++ pointers inheritance

我的父母班有多个孩子

namespace var
{
enum type {t_int, t_float, t_string, t_null};

class root
    {
    public:
        type t = t_null;
        root(type t) : t(t) {}
    }

class v_int : public root
    {
    public:
        int value;
        v_int() : root(t_int) {}
        v_int(int value) : value(value), root(t_int) {}
    }
class v_float : public root
    {
    public:
        float value;
        v_float() : root(t_float) {}
        v_float(float value) : value(value), root(t_float) {}
    }
class v_string : public root
    {
    public:
        std::string value;
        v_string() : root(t_string) {}
        v_string(std::string value) : value(value), root(t_string) {}
    }
}

和一个需要在root*中创建子项的副本的函数,但是该子项已经作为root *出现了,我希望避免进行开关来查找类型,调用特定的构造函数以及将其分配给root *,因为所有子对象都相同。

var::root* source = new var::v_int(5);
var::root* copy = /*copy of source*/;

是的,我知道,原始指针,我怎么敢!!!无论如何,我不是在这里讨论指针类型的选择。


我知道我可以用一个类和一个联合来做类似的事情,但是该类将被大量使用,并且我不希望将来的“ v_uint8_t”占用像“ v_int64_t”一样多的空间

1 个答案:

答案 0 :(得分:1)

我不确定我是否理解您的要求,您是否正在寻找一种无需切换潜在子类即可复制元素的方法?

如果是这种情况,只需在您的root类中添加一个纯虚拟成员函数:

class root{
  // [...]
  public:
    virtual root* clone() const = 0;
  // [...]
};

并在子类中实现它:

class v_int : public root{
  // [...]
  public:
    root* clone() const override{
      return new v_int{this->value};
    }
  // [...]
};

除此之外,在您的示例中,您没有显示任何继承(构造函数调用除外)。