- 主题:为啥virtual clone(),返回智能指针,不能covariance?
我觉得你完全理解偏了。我不知道怎么解释了。
【 在 hongdiao 的大作中提到: 】
:
: 也许我误解了LZ的本意。 但是这个问题的引入不只是需要一个虚函数, 而是需要一个能够在外面使用基类指针或者引用调用的虚函数吧? 这也是虚函数的最常见的用法: 代码拿到一个指向基类的指针或者引用,不管其具体类型,通过调用虚函数得到合适的行为。
: 你的方案里面,虚函数是是pretected,外界无法调用。 clone又不是虚的,外面调用还需要特定子类型。
--
FROM 76.126.252.*
我没明白。你这还是指针啊。多继承你返回的指针大小还是一样的啊。
返回值大小编译时不确定,这可不是一个小事情吧?
【 在 vonNeumann 的大作中提到: 】
: 只要标准愿意引入这个特性,大小不相同不是障碍,加一个 covariant return thunk 即可
: 这种 thunk 在 C++98 的基类/子类指针的 covariance 情况下已经存在(多继承的情形)
: class A {
: ...................
--
FROM 76.126.252.*
我想了一个,这么解释你能明白吗:
Base base;
Derived derived;
Base* p = &derived;
unique_ptr<Base> a = base.clone();
unique_ptr<Base> b = p->clone(); // 这个Base其实是一个Derived对象
unique_ptr<Derived> c = derived.clone(); // 不需要强制转换了。
这三种情况都完美的解决了啊。
【 在 hongdiao 的大作中提到: 】
:
: 也许我误解了LZ的本意。 但是这个问题的引入不只是需要一个虚函数, 而是需要一个能够在外面使用基类指针或者引用调用的虚函数吧? 这也是虚函数的最常见的用法: 代码拿到一个指向基类的指针或者引用,不管其具体类型,通过调用虚函数得到合适的行为。
: 你的方案里面,虚函数是是pretected,外界无法调用。 clone又不是虚的,外面调用还需要特定子类型。
--
FROM 76.126.252.*
理论上讲,unique_ptr的size是不固定的。
你可以定义一个特化,让它长得比较大。
C++里的隐式类型转换过于强大,支持隐式类型转换协变太困难。除非定义一种新的“协变转换”,提出更强的要求。
【 在 DoorWay 的大作中提到: 】
: 高级啊,你这一句话,我查了calling convention的资料,想了好久才明白啥意思,
: 你看理解的对不:以 _cdel 64为例,分析
: 返回指针时,大小固定,返回值写入RAX即可。
: ...................
--
FROM 76.126.252.*