• c – 使用智能指针返回类型协方差

    在C中我们可以这样做:

    struct Base
    {
       virtual Base* Clone() const { ... }
       virtual ~Base(){}
    };
    
    struct Derived : Base
    {
       virtual Derived* Clone() const {...} //overrides Base::Clone
    };

    但是,以下内容不会做同样的伎俩:

    struct Base
    {
       virtual shared_ptr<Base> Clone() const { ... }
       virtual ~Base(){}
    };
    
    struct Derived : Base
    {
       virtual shared_ptr<Derived> Clone() const {...} //hides Base::Clone
    };

    在此示例中,Derived :: Clone隐藏Base :: Clone而不是覆盖它,因为标准表示重写成员的返回类型可能仅从引用(或指针)更改为base到引用(或指针)到派生.这有什么聪明的解决方法吗?当然有人可能会争辩说Clone函数无论如何都应该返回一个普通的指针,但是现在让我们忘记它 – 这只是一个例证.我正在寻找一种方法来启用虚拟功能的返回类型从智能指针更改为Base到指向Derived的智能指针.

    提前致谢!

    更新:感谢Iammilind,我的第二个例子确实无法编译

    您无法直接执行此操作,但在非虚拟接口惯用法的帮助下,有几种方法可以模拟它.

    在原始指针上使用协方差,然后将它们包装起来

    struct Base
    {
    private:
       virtual Base* doClone() const { ... }
    
    public:
       shared_ptr<Base> Clone() const { return shared_ptr<Base>(doClone()); }
    
       virtual ~Base(){}
    };
    
    struct Derived : Base
    {
    private:
       virtual Derived* doClone() const { ... }
    
    public:
       shared_ptr<Derived> Clone() const { return shared_ptr<Derived>(doClone()); }
    };

    这只适用于你实际上有一个原始指针开始.

    通过铸造模拟协方差

    struct Base
    {
    private:
       virtual shared_ptr<Base> doClone() const { ... }
    
    public:
       shared_ptr<Base> Clone() const { return doClone(); }
    
       virtual ~Base(){}
    };
    
    struct Derived : Base
    {
    private:
       virtual shared_ptr<Base> doClone() const { ... }
    
    public:
       shared_ptr<Derived> Clone() const
          { return static_pointer_cast<Derived>(doClone()); }
    };

    在这里,您必须确保Derived :: doClone的所有覆盖实际上都返回指向Derived或从其派生的类的指针.

    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    最准网站特马资料四肖期期准一2020特马开奖结果查询三肖中特期期准免费118图库 什邡市| 洪雅县| 门头沟区| 平谷区| 漳浦县| 渭源县| 扶余县| 耒阳市| 西盟| 晋州市| 潢川县| 乃东县| 和田县| 石柱| 伊金霍洛旗| 拉萨市| 清水县| 武山县| 阿坝县| 平乡县| 石林| 南平市| 永靖县| 邵武市| 陕西省| 龙胜| 米易县| 朝阳区| 泾阳县| 陈巴尔虎旗| 鄂温| 泽库县| 荔浦县| 苍溪县| 凤台县| 庄浪县| 台东县| 鸡泽县| 鄂托克前旗| 米易县| 马龙县| 绿春县| 吉隆县| 龙陵县| 河东区| 乃东县| 鄂伦春自治旗| 辽阳县| 佛冈县| 容城县| 松江区| 宁陵县| 鄯善县| 迁西县| 台山市| 蒙阴县| 长海县| 建水县| 浮梁县| 鹿泉市| 乳山市| 任丘市| 江孜县| 玛纳斯县| 府谷县| 吴堡县| 团风县| 延吉市| 临江市| 蚌埠市| 永城市| 石景山区| 那曲县| 化德县| 新平| 唐河县| 墨脱县| 荔波县| 阳新县| 商河县| 乌鲁木齐市| 长白| 湾仔区| 伊春市| 安康市| 井冈山市| 安福县| 万州区| 双江| 浦城县| 崇州市| 廉江市| 安阳市| 南安市| 荥阳市| 太和县| 突泉县| 上林县| 东丽区| 桂林市| 宜昌市| 东明县| 肇庆市| 民勤县| 富蕴县| 昂仁县| 长阳| 马边| 尤溪县| 慈溪市| 呼伦贝尔市| 静乐县| 和平县| 温宿县| 清徐县| 阜阳市| 甘孜县| 承德市| 临猗县| 南京市| 五寨县| 甘洛县| 池州市| 两当县| 北宁市| 渝北区| 柳林县| 上饶市| 贡山| 泸州市| 大渡口区| 景德镇市| 朔州市| 贡觉县| 防城港市| 桃园市| 平顶山市| 台北市| 韶山市| 曲周县| 武平县| 福安市| 菏泽市| 周至县| 德钦县| 三门峡市| 西丰县| 土默特左旗| 阿巴嘎旗| 明水县| 兴义市| 军事| 同仁县| 大新县| 上栗县| 晋城| 德保县| 株洲市| 湖南省| 屏南县| 阜南县| 赤峰市| 饶阳县| 定结县| 施秉县| 新龙县| 卢龙县| 博白县| 达拉特旗| 宣武区| 白河县| 海兴县| 调兵山市| 台北市| 北安市| 阜新| 集安市| 呼伦贝尔市| 临城县| 辉县市| 陆川县| 定州市| 松溪县| 昆明市| 泽州县| 衡山县| 保定市| 海门市| 濮阳市| 越西县| 开平市| 象州县| 诸城市| 四会市| 菏泽市| 崇明县| 威宁| 门源| 新郑市| 贵阳市| 鹿泉市| 即墨市| 房产| 名山县| 石泉县| 会泽县| 呈贡县| 普宁市| 济源市| 亳州市| 个旧市| 兴和县| 渑池县| 屏东市| 大丰市| 鄂州市| 高安市| 新野县| 襄城县| 罗田县| 鄢陵县| 望江县| 宁波市| 股票| 招远市| 徐水县| 新蔡县| 大名县| 鄢陵县| 桃园县| 囊谦县| 运城市| 新密市| 綦江县| 台前县| 安仁县| 葫芦岛市| 阆中市| 孙吴县| 中宁县| 佳木斯市| 云霄县| 安宁市| 安国市| 阳城县| 辽宁省| 连江县| 同江市| 浮山县| 稷山县| 格尔木市| 襄樊市| 深泽县| 绍兴市| 平利县| 卢龙县| 焦作市| 元阳县| 南开区| 华安县| 麻城市| 新丰县| 浪卡子县| 蒙阴县| 广昌县| 吴江市| 达日县| 堆龙德庆县| 堆龙德庆县| 邻水| 凭祥市| 玉门市| 武义县| 攀枝花市| 加查县| 石嘴山市| 丹江口市| 临泉县| 休宁县| 武宁县| 钟山县| 齐河县| 宝应县| 禄劝| 运城市| 通江县| 高清| 水富县| 柳林县| 贺州市| 南华县| 绥阳县| 石阡县| 柘城县| 开封县| 泰兴市| 罗城| 南昌市| 乌兰县| 连南| 晋江市| 岑溪市| 房产| 庆阳市| 堆龙德庆县| 岳西县| 天等县| 邹平县| 利津县| 焦作市| 通州市| 双江| 政和县| 宽城| 阜南县| 新化县| 峨山| 紫云| 兴业县| 万源市| 聂拉木县| 文水县| 松溪县| 十堰市| 壤塘县| 双桥区| 郧西县| 普兰店市| 聂拉木县| 莱州市| 霸州市| 惠东县| 诸城市| 余庆县| 宜阳县| 梅州市| 永登县| 承德县| 离岛区| 余庆县| 平塘县| 弥勒县| 万州区| 怀来县| 新化县| 梅河口市| 临武县| 乌鲁木齐县| 红河县| 鄂托克旗| 河津市| 浦东新区| 青铜峡市| 淮阳县| 东乌珠穆沁旗| 原平市| 洪湖市| 鄂伦春自治旗| 长治市| 普兰县| 榆树市| 桦南县| 永康市| 灵宝市| 会泽县| 公安县| 新晃| 穆棱市| 乐至县| 西华县| 龙里县| 炉霍县| 大理市| 姚安县| 三原县| 曲麻莱县| 尼木县| 梅州市| 张家界市| 明光市| 特克斯县| 通许县| 西乌| 甘南县| 婺源县| 茂名市| 美姑县| 平邑县| 高青县| 诸暨市| 霞浦县| 永和县| 威宁| 登封市| 五台县| 儋州市| 青浦区| 鄂温| 扎赉特旗| 克什克腾旗| 雅江县| 会泽县| 天水市| 闸北区| 安庆市| 当涂县| 玉环县| 新余市| 安徽省| 武安市| 梧州市| 澄迈县| 靖西县| 溧水县| 隆子县| 阿拉善左旗| 陇南市| 南通市| 秭归县| 龙口市| 武冈市| 忻城县| 咸宁市| 瑞金市| 南汇区| 彭阳县| 崇左市| 乐业县| 桐城市| 内乡县| 西和县| 中阳县| 余干县| 潮州市| 黑水县| 东乡族自治县| 平和县| 名山县| 青铜峡市| 隆安县| 高唐县| 莒南县| 长治县| 阿勒泰市| 龙南县| 额敏县| 灌云县| 高雄县| 来凤县| 拜城县| 铜鼓县| 常德市| 宁远县| 郁南县| 平江县| 咸宁市| 邵阳县| 莱芜市| 松江区| 双江| 九江市| 铁力市| 桓仁| 四子王旗| 海口市| 玉树县| 满城县| 昆山市| 茌平县| 南昌市| 潜山县| 双柏县| 旬阳县| 千阳县| 青海省| 元江| 清新县| 全椒县| 基隆市| 保靖县| 崇文区| 巢湖市| 石阡县| 浑源县| 云梦县| 双桥区| 盐池县| 澎湖县| 股票| 育儿| 察隅县| 荔浦县| 长葛市| 安丘市| 龙游县| 子长县| 鹤峰县| 卢龙县| 荆州市| 房产| 萝北县| 金沙县| 垣曲县| 宝应县| 陕西省| 阿克陶县| 黄大仙区| 阿克苏市| 施秉县| 贺州市| 福鼎市| 贡觉县| 调兵山市| 双柏县| 黄陵县| 永嘉县| 孝感市| 盐津县| 朔州市| 扶绥县| 墨脱县| 连南| 柯坪县| 玉树县| 定结县| 雷州市| 华坪县| 萨嘎县| 城固县| 白河县| 贡嘎县| 周宁县| 柳林县| 灵台县| 郎溪县| 毕节市| 健康| 长汀县| 虞城县| 灌阳县| 安义县| 瑞昌市| 获嘉县| 济宁市| 新密市| 凌海市| 乌鲁木齐县| 吉木乃县| 砚山县| 牙克石市| 桑日县| 大田县| 华亭县| 长治县| 青冈县| 潍坊市| 建始县| 吉首市| 汝南县| 万载县| 永城市| 潍坊市| 灵川县| 长乐市| 昔阳县| 漳平市| 股票| 桐柏县| 延安市| 乌兰浩特市| 民乐县| 北票市| 北海市| 巧家县| 乌鲁木齐县| 湖州市| 桓台县| 同江市| 北宁市| 台安县| 互助| 五莲县| 神池县| 潜江市| 黄骅市| 荔浦县| 哈密市| 平果县| 定边县| 运城市| 陆丰市| 米泉市| 房产| 乌鲁木齐县| 姜堰市| 北宁市| 连云港市| 元江| 富源县| 吴川市| 三门县| 昭通市| 华安县| 安塞县| 梨树县| 常山县| 吉首市| 阿拉尔市| 宜兴市| 蒲江县| 九寨沟县| 湾仔区| 嘉义县| 灵武市| 留坝县| http://wap.jx1870expectv.fun http://www.jx1870forzv.fun http://www.jx1870freev.fun http://wap.hz0j2r6vo.fun http://www.jx1870enhancev.fun http://www.jx1870exchangev.fun http://m.jx1870estizatev.fun http://www.jx1870fillv.fun http://www.hz0j0r8vo.fun http://wap.jx1870layerv.fun http://m.jx1870expectv.fun http://www.jx1870fixv.fun http://jx1870fightv.fun http://wap.jx1870growv.fun http://jx1870forzatv.fun http://wap.jx1870factorv.fun http://www.jx1870forestv.fun http://m.jx1870establishv.fun