将子项复制构造到父类型指针中

copy-construct child into parent type pointer

本文关键字:父类 类型 指针 复制      更新时间:2023-10-16

我有一个有多个孩子的父类

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"一样多的空间

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

如果是这种情况,只需在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};
    }
  // [...]
};

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