协变返回类型允许派生类虚函数返回基类返回类型的派生类指针或引用,需满足:同名、同参数、同cv限定、同指针/引用类别、公有继承;不支持值类型和智能指针。
协变返回类型是指在派生类中重写基类虚函数时,允许返回类型不是完全相同,而是基类返回类型的派生类。这种机制只适用于返回指针或引用的虚函数,且要求返回类型的转换是安全的(即派生类指针/引用可隐式转为基类指针/引用)。
要合法使用协变返回类型,必须同时满足以下条件:
假设有类层次:Shape 是基类,Circle 公共继承自 Shape:
class Shape { public: virtual Shape* clone() const { return new Shape(*this); } };
class Circle : public Shape { public: virtual Circle* clone() const override { return new Circle(*this); } };这里 Circle::clone() 的返回类型 Circle* 是 Shape* 的派生类指针,符合协变规则。调用 Circle 对象的 clone() 会返回更精确的类型,避免强制转型。
协变仅支持原生指针和左值引用,因为它们的转换关系明确且无二义性。而值类型(如 Shape vs Circle)涉及对象切片,无法安全协变;智能指针(如 std::unique_ptr
协变返回类型提升的是接口的精确性,但多态调用仍依赖静态类型:
仍是 Shape*,即使实际返回 Circle*