基类virtual func返回类型为某个类(class Super)的ptr或ref,子类重写的virtual func返回类型可改为该类子类(class Sub : public Super)的ptr或ref。

class Base
{
public:
    virtual Base* clone() const { return new Base(*this); }
    virtual ~Base() {}
};

class Derived : public Base
{
public:
    virtual Base* clone() const { return new Derived(*this); }
    virtual ~Derived() {}
};

int main()
{
    Derived d;
    Base* bPtr = d.clone();
    Derived* dPtr = dynamic_cast<Derived*>(bPtr);
    if(!dPtr) {
        delete dPtr;
        dPtr = nullptr;
        // throw exception ...
    }
    ;
}

改为:
......

class Derived : public Base
{
public:
    virtual Derived* clone() const { return new Derived(*this); }
    virtual ~Derived() {}
};

int main()
{
    Derived d;
    Derived* dPtr = d.clone();
    ;
}

class Cherry {};

class BingCherry : public Cherry {};

class CherryTree
{
public:
    virtual Cherry* pick() const { return new Cherry(); }
};

class BingCherryTree : public CherryTree
{
public:
    virtual BingCherry* pick() const { return new BingCherry(); }
};

Covariant Returen Types(协变返回类型)的更多相关文章

  1. c++ 类覆盖方法中的协变返回类型

    c++ 类覆盖方法中的协变返回类型 在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型.这样的类型称为协变返回类型(Covarian ...

  2. 协变返回类型---《C++必知必会》 条款 31

    一般来说,一个重写的函数与被它重写的函数具有相同的返回类型. 然而,这个规则对于“协变返回类型(covariant  return type)“的情形来说有所放松.也就是说,如果B是一个类类型,并且一 ...

  3. Java协变返回类型

    今天看到句话:“支持重写方法时返回协变类型”. 那么什么事协变类型?在网上找了找资料,大体上明白了. Java 5.0添加了对协变返回类型的支持,即子类覆盖(即重写)基类方法时,返回的类型可以是基类方 ...

  4. 理解Java中的协变返回类型

    在面向对象程序设计中,协变返回类型指的是子类中的成员函数的返回值类型不必严格等同于父类中被重写的成员函数的返回值类型,而可以是更 "狭窄" 的类型. Java 5.0添加了对协变返 ...

  5. Java 协变返回类型

    协变返回类型表示在导出类的被覆盖方法可以返回基类方法的返回类型的某种导出类型 //: polymorphism/covarianreturn.java package object; class Gr ...

  6. iOS 用instancetype代替id作返回类型有什么好处?

    2014-07-07更新:苹果在iOS 8中全面使用instancetype代替id Steven Fisher:只要一个类返回自身的实例,用instancetype就有好处. @interface ...

  7. HttpClient获取返回类型为JSON或XML的数据

    Java_HttpClient获取返回类型为JSON或XML的数据 原创 2017年04月06日 17:38:29 706 HttpClient 获取返回类型为JSON或XML的数据 使用httpco ...

  8. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  9. springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序 http://www.360doc.com/content/14/03 ...

随机推荐

  1. MCU助推居家移动医疗微型化

    随着行动装置的快速普及,近几年行动医疗成为热门话题,市场成长迅速,也引发了不少新的商业模式.根据美通社一份市场调查报告指出,行动医疗市场在2018年将达到234.9亿美元的规模,2013至2018年期 ...

  2. 使用 Spring Boot 快速构建 Spring 框架应用,PropertyPlaceholderConfigurer

    Spring 框架对于很多 Java 开发人员来说都不陌生.自从 2002 年发布以来,Spring 框架已经成为企业应用开发领域非常流行的基础框架.有大量的企业应用基于 Spring 框架来开发.S ...

  3. BZOJ 1037 [ZJOI2008]生日聚会Party

    1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1583  Solved: 936[Submit][ ...

  4. -_-#微信内置JavaScript API WeixinJSBridge

    微信相关的 js 操作:分享.网络.菜单 微信内置JsAPI之WeixinJSBridge微信WeixinJSBridge API续

  5. -_-#Android版QQ浏览器广告过滤

    省流加速 - 广告过滤   默认开启 设别广告是添加的标签最外层标签带有adv download

  6. windows程序设计简介

    大家好,非常高兴和大家一起分享Windows开发心得,Windows已经诞生很多年了,一直因为它的简单易用而深受欢迎,相信很多人在使用Windows的时候,一定有这样一个想法:希望自己将来可以写一个很 ...

  7. JAVA调用.NET WebService终极方案(包含对SoapHeader的处理)

    一.前言:      今日部门的产品需要用到短信功能,需要走公司统一的接口,而该短信接口是由.net开发的,利用两天时间彻底搞定了用java来调用.net 的web service,包括对soap h ...

  8. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备

    背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...

  9. oracle查询和断开用户session

    select sid,serial#,username from v$session where username='user_name';alter system kill session 'sid ...

  10. iOS常用的开源类库

    开发几个常用的开源类库及下载地址: 引用 1.json json编码解码 2.GTMBase64 base64编码解码 3.TouchXML xml解析 4.SFHFKeychainUtils 安全保 ...