协变返回值类型

面向对象程序设计中,实例函数的协变返回值类型指的是子类中的成员函数的返回值类型不必严格等同与该函数所重写的父类中的函数的返回值类型,而可以是更 "狭窄" 的类型。在 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;
}

参见

协变与逆变

外部链接