- 主题:为啥virtual clone(),返回智能指针,不能covariance?
看到jason turner有一个视频讲怎么用一个wrapper去实现
https://youtu.be/tvGCQmE5-Fs
如果有大量子类返回更具体的smart pointer可以引入一下
【 在 DoorWay 的大作中提到: 】
: virtual unique_ptr<Child> Child::Clone() override;
:
: 最近有这种需求,子类提供克隆方法,返回自身类型的智能指针,不行。必须返回基类的智能指针?
: ....................
- 来自「最水木 for iPhone12,8」
--
FROM 75.31.75.*
Technically,既然接口是基类的指针,那派生类返回派生类的指针只是一个实现细节,不应体现在接口上。
【 在 DoorWay () 的大作中提到: 】
: 倒不是怕效率损失,工作的项目控制没有这么精细。
: 就是使用的不方便,读起来别扭,或许读的不够多。:-)
:
: 抑或为了形式的美感,一时思维的误区?
--
FROM 59.148.127.*
哦有道理!!
【 在 here080 () 的大作中提到: 】
: 这个问题的核心实质在于此处返回值是有实际物理内存要求的。如果允许子类重写的函数返回不同类型,那有可能该类型的大小跟父类返回类型大小不同。
: 基于这个原因,标准里只有指针和引用才有可能covariance
:
: 除非将unique_ptr作为语言内置功能,否则以类库的身份是不行的。
--
FROM 59.148.127.*
哦!有道理!!
【 在 vonNeumann () 的大作中提到: 】
: 只要标准愿意引入这个特性,大小不相同不是障碍,加一个 covariant return thunk 即可
:
: 这种 thunk 在 C++98 的基类/子类指针的 covariance 情况下已经存在(多继承的情形)
:
--
FROM 59.148.127.*
【 在 here080 的大作中提到: 】
: 我想了一个,这么解释你能明白吗:
: Base base;
: Derived derived;
: ...................
先赞一下code,清晰明了~
我完全知道你的方案会达到这样的效果啊, 我只不过不知道这样是否能完全解决原来LZ的要求
“最近有这种需求,子类提供克隆方法,返回自身类型的智能指针,不行。必须返回基类的智能指针”
我觉得目前看了LZ的这个要求“从字面上来看”是没法满足的。 但是你的方案确实很不错,满足了LZ的真正的实际要求。 这么说是不是大家都能理解了~~
--
FROM 222.126.162.*
如果是这种模式,不是应该是template来做吗?做一个
Clone<typename>()的模板,内部检查一下是不是基于base类的不就是了
【 在 vonNeumann 的大作中提到: 】
: 因为并不知道实际使用时拿的是一个 Base 还是 Child,有的地方会用 Base* 去调用,有的会用 Child* 去调用
: Base *p;
: p->Clone() // 它返回Base*
: ...................
--
FROM 122.224.174.*
C++不支持。自定义类型的covariance/contravariance你得用Scala。
【 在 DoorWay 的大作中提到: 】
: virtual unique_ptr<Child> Child::Clone() override;
: 最近有这种需求,子类提供克隆方法,返回自身类型的智能指针,不行。必须返回基类的智能指针?
: 这种一般怎么设计解决?
--
FROM 58.37.58.*
这语言值得投入不,我就会一点cpp,有心拓宽一点技能
【 在 ilovecpp 的大作中提到: 】
: C++不支持。自定义类型的covariance/contravariance你得用Scala。
--
FROM 124.114.151.*
我觉得不合适。
1. scala很复杂。c++已经很复杂了,你还要再学一门同样复杂的语言吗?
2. scala,就如它名字的意思,初衷就是要用比c++更强的类型系统来支持大规模程序。但是现在哪有这么多单体大规模程序,有也多半是java和c++写的。
3. jvm上的其它语言,流行程度相对java都非常低,不如学java。
【 在 DoorWay 的大作中提到: 】
: 这语言值得投入不,我就会一点cpp,有心拓宽一点技能
--
FROM 58.37.58.*
看着玩玩挺好啊
【 在 DoorWay (DoorWay) 的大作中提到: 】
: 这语言值得投入不,我就会一点cpp,有心拓宽一点技能
--
FROM 114.85.170.*