resueltos poo herencia ejercicios destructores constructores codigo clases c++ templates constructor c++11

poo - Reenviando todos los constructores en C++ 0x



herencia en c++ ejercicios resueltos (2)

Hay una mejor manera en C ++ 0x para esto

class X: public Super { using Super::Super; };

Si declara una plantilla de reenvío perfecto, su tipo se comportará mal en la resolución de sobrecarga. Imagina que tu clase base es convertible desde 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);

Lo llamas con

printOut("hello");

¿Cómo se llamará? Es ambiguo, porque Specific puede convertir cualquier argumento, incluyendo matrices de caracteres. Lo hace sin tener en cuenta los constructores de clase base existentes . La herencia de constructores con declaraciones utilizando solo declara los constructores que son necesarios para hacer que esto funcione.

¿Cuál es la forma correcta de reenviar todos los constructores de los padres en C ++ 0x?

He estado haciendo esto:

class X: public Super { template<typename... Args> X(Args&&... args): Super(args...) {} };


Creo que necesitas hacer Super(std::forward<Args>(args)...) si quieres que las cosas se envíen correctamente. args tiene un nombre, por lo que creo que se unirá a las referencias regulares antes de las referencias de valor.

Sin embargo, lo más importante es que no enviarás constructores de copias de esta manera. El compilador seguirá generando uno para ti, porque no considera a los constructores de plantillas. En el ejemplo proporcionado, está bien, porque el compilador generado solo llamará al constructor de copia principal de todos modos, que es exactamente lo que desea. Si eso no es apropiado en un caso más complicado, entonces tendrá que escribirlo usted mismo.