協變返回值類型

面向對象程序設計中,實例函數的協變返回值類型指的是子類中的成員函數的返回值類型不必嚴格等同與該函數所重寫的父類中的函數的返回值類型,而可以是更 "狹窄" 的類型。在 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;
}

參見

協變與逆變

外部連結