協變返回值類型

在面向對象程序設計中 ， 實例函數的協變返回值類型指的是子類中的成員函數的返回值類型不必嚴格等同與該函數所重寫的父類中的函數的返回值類型 ， 而可以是更 " 狹窄 " 的類型 。 在 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 std:: auto_ptr <BaseClass> generate; }; class SubGenerator: public BaseGenerator { virtual std:: auto_ptr <SubClass> generate; }; 其原因是爲了防止通過協變機制繞過類型機制 ， 使得某個指針指向了一個不兼容類型的對象 。 如 ： class BaseClass { }; class SubClassA: public BaseClass { }; class SubClassB: public BaseClass { }; int main ( void ) { std:: auto_ptr <SubClassA> subp ( new SubClassA ); std:: auto_ptr <BaseClass> & basep = subp; / / 如果此句可以通過編譯 basep.reset ( new SubClassB ); / / 此句合法. 此時 subp 內的對象實際類型爲與 SubClassA 不兼容的 SubClassB return 0; }