- 主题:为啥virtual clone(),返回智能指针,不能covariance?
virtual unique_ptr<Child> Child::Clone() override;
最近有这种需求,子类提供克隆方法,返回自身类型的智能指针,不行。必须返回基类的智能指针?
这种一般怎么设计解决?
--
修改:DoorWay FROM 1.80.221.*
FROM 1.80.221.*
这玩意儿理论上的难点在哪儿?为啥不做成标准、编译器直接支持呢。
【 在 fanci 的大作中提到: 】
: 没啥好办法,返回基类的吧
--
FROM 124.114.151.*
为什么奇葩?是error-prone,还是过于精细?我听不出好坏哈
我调研了,希望构造函数可以virtual,是非分之想。
这种clone后,希望直接是Child type,调用Child 方法,还算合理的要求吧?
【 在 Madlee 的大作中提到: 】
: 主要是你的需求太奇葩。
:
--
FROM 117.39.234.*
有一点感觉了。其它语言呢,上面有大侠提到jvav也不行,有行的语言不?
【 在 vonNeumann 的大作中提到: 】
: unique_ptr 毕竟是库实现的,如果要支持,怕是得对所有可以隐式转换的类型都支持才行。。如果单独给 unique_ptr/shared_ptr 开口子那太难看。。
:
--
FROM 124.114.151.*
倒不是怕效率损失,工作的项目控制没有这么精细。
就是使用的不方便,读起来别扭,或许读的不够多。:-)
抑或为了形式的美感,一时思维的误区?
【 在 hgoldfish 的大作中提到: 】
: 多写一个 dynamic_cast<> 的事,不值得吧。。
: java 的 clone() 同样返回 Object, 而不是子类。
:
--
修改:DoorWay FROM 124.114.151.*
FROM 124.114.151.*
赞,获得了大略。
我的疑问,指针与引用可以,是语言 spec of covariance明确规定,1 convertible 2 sizeof相等了吗?
我直觉的以为,只要求convertible 。有没有资料查。
【 在 here080 的大作中提到: 】
: 这个问题的核心实质在于此处返回值是有实际物理内存要求的。如果允许子类重写的函数返回不同类型,那有可能该类型的大小跟父类返回类型大小不同。
: 基于这个原因,标准里只有指针和引用才有可能covariance
: 除非将unique_ptr作为语言内置功能,否则以类库的身份是不行的。
--
FROM 117.39.234.*
赞博闻广识,查到一点资料,正是如此处理。
【 在 here080 的大作中提到: 】
: 如果你一定要这么搞,可以用一虚一实:
: class Base {
: protected:
: ...................
--
FROM 117.39.234.*
子类再加个Clone,返回想要的类型,
【 在 hongdiao 的大作中提到: 】
:
: 他这个方案能满足你的要求吗? 返回的类型还是unique_ptr<Base>而不是unique_ptr<Child>啊? 你需求到底是什么?
--
FROM 1.80.221.*
这语言值得投入不,我就会一点cpp,有心拓宽一点技能
【 在 ilovecpp 的大作中提到: 】
: C++不支持。自定义类型的covariance/contravariance你得用Scala。
--
FROM 124.114.151.*