Covarianza de C ++ en parámetros

Quería saber por qué C ++ no admite la covarianza en parámetros como en el ejemplo a continuación o si hay una manera de lograrlo.

class base {
public:
virtual base* func(base * ptr) { return new base(); }
};

class derived : public base {
 public:
 virtual derived* func(derived * ptr) override { return new derived(); } //not allowed
};

Respuestas a la pregunta(1)

Su respuesta a la pregunta