que tienen esta pieza de código (ideado a partir de mis problemas de la vida real)Uso de los parámetros de tipo de subclase en funciones virtuales
no puede compilar, quejándose ExtendsB no implementa B::Run(A* a)
. Sin embargo, no tiene problemas para comprender la extensión de A* Run();
class A { };
class ExtendsA : public A { };
class B
{
public:
virtual ~B(){}
virtual void Run(A* a) = 0;
virtual A* Run() = 0;
};
class ExtendsB : public B
{
public:
virtual ~ExtendsB(){}
// Not OK! It does not see it as an implementation of
// virtual void Run(A* a) = 0;
virtual void Run(ExtendsA* ea) {};
virtual ExtendsA* Run() { return new ExtendsA(); }; // OK
};
Por qué C++ permite cambiar el tipo de retorno a una sub-clase, pero no el tipo de parámetro?
¿Es una buena razón o solo un punto perdido en las especificaciones del idioma?
Para esa regla, los argumentos no necesitan coincidir al 100%. Si bien * los argumentos * covariantes * romperían esa regla, * los argumentos * contra variant * no lo romperían (todos los argumentos que pueden pasarse a la base también se pueden pasar al tipo derivado) y tampoco están permitidos. Parte de la razón es que la x-varianza no viene gratis y debe ser manejada por trampolines/thunks que arreglan los argumentos devueltos (en el caso de la covarianza). Permitir contra varianza en los argumentos aumentaría enormemente (exponencialmente) el número requerido de funciones de trampolín y el tamaño de la tabla virtual. –