¿Podemos hacer que un constructor de copia de clase sea virtual en C++? ¿Cómo utilizar?¿Podemos hacer un constructor de copia de clase virtual en C++
Respuesta
No, los constructores no pueden ser virtuales.
C++ 03 - 12,1 Constructors
4) Un constructor no será
virtual
(10.3) ostatic
(9.4). [...]
Si necesita algo como esto, puede buscar el idioma del constructor virtual here.
Nunca, no será posible en C++.
No. C++ al ser un lenguaje estático, no tiene sentido para el compilador de C++ crear un objeto polimórficamente. El compilador debe conocer el tipo de clase para crear el objeto. En otras palabras, qué tipo de objeto crearse es una decisión de tiempo de compilación desde la perspectiva del compilador de C++. Si hacemos el constructor virtual, el compilador marca un error.
No del todo cierto, vea el patrón abstracto de fábrica. –
No, no puedes.
Además, todo el concepto no tiene sentido. Las funciones virtuales son funciones que se envían en función del valor de un objeto (el tipo dinámico del objeto). Cuando se llama a un constructor, el objeto aún no tiene un valor (porque aún no se ha construido). Por lo tanto, posiblemente no se produzca ningún despacho virtual.
Piénselo. ¿Qué semántica tendría tal constructor?
No se puede porque la memoria está asignada antes de llamar al constructor en función del tamaño del nuevo tipo, no del operando de copia. Y si funcionara, sería un caso especial que el polimorfismo invertido para una serie de construcciones de lenguaje.
Pero eso no significa que no se pueda hacer con un poco de magia C++. :)
Hay un par de casos en los que es increíblemente útil, la serialización de clases que no son POD, por ejemplo. Este ejemplo crea un constructor de copia virtual que funciona con la colocación nueva.
Advertencia: este es un ejemplo que puede ayudar a algunos usuarios con problemas específicos. No hagas esto en código de propósito general. Se bloqueará si la memoria asignada para la nueva clase es más pequeña que la clase derivada. La mejor (y única) forma segura de utilizar esto es si está administrando su propia memoria de clase y utilizando la ubicación nueva.
class VirtualBase
{
public:
VirtualBase() {}
virtual ~VirtualBase() {}
VirtualBase(const VirtualBase& copy)
{
copy.VirtualPlacementCopyConstructor(this);
}
virtual void VirtualPlacementCopyConstructor(void*) const {}
};
class Derived :: public VirtualBase
{
public:
...
Derived(const Derived& copy) : ... don't call baseclass and make an infinite loop
{
}
protected:
void VirtualPlacementCopyConstructor(void* place) const
{
new (place) Derived(*this);
}
};
Esto no se compilará, incluso si lo arregla para compilarlo, la implementación está completamente rota. Todos los miembros de 'Derived' sufrirán una doble inicialización. Esto podría funcionar con algunos tipos simples, pero claramente resulta en un comportamiento indefinido. El "constructor" necesitaría ser 'void VirtualPlacementCopyConstructor (VirtualBase * place) const {auto d = dynamic_cast
Ahora debería ser obvio cuál es el problema: el' VirtualPlacementCopyConstructor' se invoca demasiado pronto, cuando el tipo de la clase copiada en -tarea no es 'Derived' aún. Por lo tanto, el destructor tampoco hará lo correcto, y obtendrá un comportamiento indefinido en abundancia. Si reemplaza 'dynamic_cast' con' static_cast', las cosas funcionarán para los tipos de POD, y eso es todo. Tan pronto como añada, p. un miembro de 'std :: string', las cosas se romperán (peor aún: no siempre se romperá, por lo que te sacarás el pelo). –
- 1. C++ Virtual Constructor, sin clon()
- 2. constructor de copia: copia completa una clase abstracta
- 3. ¿Podemos hacer una copia inteligente en Python?
- 4. ¿Podemos tener un método estático virtual? (C++)
- 5. const en constructor de copia en C++
- 6. implícito constructor de copia
- 7. ¿Podemos tener un constructor privado en una clase estática?
- 8. Copia de clase C++ (copia de puntero)
- 9. ¿Podemos detener la ejecución de un constructor?
- 10. Llamar al constructor sobrecargado de una clase base virtual
- 11. constructor o constructor de copia?
- 12. C++: Copia profunda de un puntero de clase base
- 13. C++ constructor de copia, los temporales y la semántica copia
- 14. Orden de constructor en la herencia virtual
- 15. Pregunta de clase virtual pura de C++
- 16. Constructor de copia de Matlab
- 17. constructor de copia generalizada en una clase interna
- 18. tema visibilidad para constructor de copia de clase base
- 19. Cómo escribir el constructor de copia de clase de plantilla
- 20. Constructor predeterminado y herencia virtual
- 21. ¿Por qué el constructor de copia implícita llama al constructor de copia de la clase base y el constructor de copia definido no?
- 22. ¿Podemos interrumpir la creación de un objeto en el constructor
- 23. En .NET ¿una clase puede tener constructor virtual?
- 24. Simulando un miembro estático virtual de una clase en C++?
- 25. ¿Un constructor con plantilla reemplaza el constructor de copia implícita en C++?
- 26. C# clase sin constructor
- 27. Creación de un constructor de copia de una lista enlazada
- 28. Llamada de miembro virtual en el constructor
- 29. C++ - ¿Cómo inicializo un constructor de una clase separada del constructor de una clase?
- 30. C++ llamada a un método virtual en clase hija
Suponiendo que se pudiera ... ¿a qué tipo debe enviarse la llamada del constructor? –
Duplicado de http://stackoverflow.com/questions/733360/why-do-we-not-have-a-virtual-constructor-in-c –
@ DavidRodríguez-dribeas: Ese es un buen punto. Creo que debería ser una respuesta, ya que también explica la razón de ser – Nawaz