- 主题:为啥virtual clone(),返回智能指针,不能covariance?
Java 有个 Clonable 接口,里面的 clone() 方法就是返回 Object, 同样要强转。
【 在 here080 (hero080) 的大作中提到: 】
: 不是吧,java当然是返回子类了。
: java里没有值语义,全是指针,天生就covariance了
--
FROM 110.85.22.*
赞,获得了大略。
我的疑问,指针与引用可以,是语言 spec of covariance明确规定,1 convertible 2 sizeof相等了吗?
我直觉的以为,只要求convertible 。有没有资料查。
【 在 here080 的大作中提到: 】
: 这个问题的核心实质在于此处返回值是有实际物理内存要求的。如果允许子类重写的函数返回不同类型,那有可能该类型的大小跟父类返回类型大小不同。
: 基于这个原因,标准里只有指针和引用才有可能covariance
: 除非将unique_ptr作为语言内置功能,否则以类库的身份是不行的。
--
FROM 117.39.234.*
赞博闻广识,查到一点资料,正是如此处理。
【 在 here080 的大作中提到: 】
: 如果你一定要这么搞,可以用一虚一实:
: class Base {
: protected:
: ...................
--
FROM 117.39.234.*
【 在 DoorWay 的大作中提到: 】
: 赞博闻广识,查到一点资料,正是如此处理。
他这个方案能满足你的要求吗? 返回的类型还是unique_ptr<Base>而不是unique_ptr<Child>啊? 你需求到底是什么?
--
FROM 1.91.32.*
我猜你应该Java不太熟。
Java里有两个东西:
1. Object基类定义了clone()方法。这个当然是返回Object了。而子类X重写clone()时可以(并且应该)返回X而不是Object。注意这个clone()方法默认是无效的,如果调用它会异常。
2. 有一个接口叫Cloneable.这个接口里其实是没有定义方法的。它的作用是告诉系统定义一个默认的clone()方法(即让1里面原本会抛出异常的行为改变)
【 在 hgoldfish 的大作中提到: 】
: Java 有个 Clonable 接口,里面的 clone() 方法就是返回 Object, 同样要强转。
:
--
FROM 76.126.252.*
此处可以结合底层机理来理解。
函数调用是在栈上面的指针移动,返回值一般就是最后留下来的那一块。如果编译器不知道返回值的大小,那就会有很多问题。
【 在 DoorWay 的大作中提到: 】
: 赞,获得了大略。
: 我的疑问,指针与引用可以,是语言 spec of covariance明确规定,1 convertible 2 sizeof相等了吗?
: 我直觉的以为,只要求convertible 。有没有资料查。
--
FROM 76.126.252.*
我还有一行没写出来。如果你需要子类也返回子类,在子类里也加一个:
unique_ptr<Derived> clone() { return {CloneData()}; }
【 在 hongdiao 的大作中提到: 】
:
: 他这个方案能满足你的要求吗? 返回的类型还是unique_ptr<Base>而不是unique_ptr<Child>啊? 你需求到底是什么?
--
FROM 76.126.252.*
子类再加个Clone,返回想要的类型,
【 在 hongdiao 的大作中提到: 】
:
: 他这个方案能满足你的要求吗? 返回的类型还是unique_ptr<Base>而不是unique_ptr<Child>啊? 你需求到底是什么?
--
FROM 1.80.221.*