我的父母班有多个孩子
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”一样多的空间
答案 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};
}
// [...]
};
除此之外,在您的示例中,您没有显示任何继承(构造函数调用除外)。