hay una mejor manera en C++ 0x para este
class X: public Super {
using Super::Super;
};
Si se declara una plantilla perfecta de reenvío, el tipo se comporta mal en la resolución de sobrecarga. Imagine que su clase base es convertible a partir int
y existen dos funciones para imprimir clases
class Base {
public:
Base(int n);
};
class Specific: public Base {
public:
template<typename... Args>
Specific(Args&&... args);
};
void printOut(Specific const& b);
void printOut(std::string const& s);
Usted lo llama con
printOut("hello");
lo que se llamará? Es ambiguo, porque Specific
puede convertir cualquier argumento, incluidas las matrices de caracteres. Lo hace así sin tener en cuenta los constructores existentes de la clase base. Heredar constructores con declaraciones de uso solo declara los constructores necesarios para que esto funcione.
¿Hay alguna razón para no escribir todos los constructores en lugar de utilizar un atajo de plantilla? –
Sí, es hora, y si la clase Super se actualiza, entonces estará en un lío de mantenimiento. La solución automatizada es infinitamente superior. – Puppy
@DeadMG - En realidad no. Entonces, ¿qué pasa si la base obtiene un nuevo constructor? El derivado no necesita usarlo a menos que se requiera la nueva información. En este punto, esta "solución" automatizada simplemente empuja a tratar con esto a todos los clientes derivados. En la mayoría de los casos, esto es completamente incorrecto. Derived no debe actualizarse a menos que haya algún objeto que lo necesite y debe hacerse de manera explícita para que sea obvio cómo construir el objeto mirando su constructor. Reserve las plantillas variadic para condiciones variadic. –