协变返回值类型 在面向对象程序设计中实例函数的协变返回值类型指的是子类中的成员函数的返回值类型不必严格等同与该函数所重写的父类中的函数的返回值类型而可以是更 狭窄 的类型在 C 程序设计中这是一种常见的编程范式如下面的例子 class BaseClass  class SubClass public BaseClass  class BaseGenerator  virtual BaseClass generate  class SubGenerator public BaseGenerator  virtual SubClass generate  但是协变类型不能兼容于泛型如使用到智能指针或泛型容器的场合即如下的程序是不合法的 class BaseClass  class SubClass public BaseClass  class BaseGenerator  virtual stdautoptrBaseClass generate  class SubGenerator public BaseGenerator  virtual stdautoptrSubClass generate  其原因是为了防止通过协变机制绕过类型机制使得某个指针指向了一个不兼容类型的对象如 class BaseClass  class SubClassA public BaseClass  class SubClassB public BaseClass  int mainvoid  stdautoptrSubClassA subpnew SubClassA stdautoptrBaseClass basep  subp  如果此句可以通过编译 basepresetnew SubClassB  此句合法 此时 subp 内的对象实际类型为与 SubClassA 不兼容的 SubClassB return