c++ - Un constructor no puede ser virtual
virtual-functions (5)
En uno de los tutoriales de C ++ en Internet , descubrí la siguiente descripción sobre por qué un constructor no puede ser virtual
No podemos declarar un constructor virtual. Deberíamos especificar el tipo exacto del objeto en tiempo de compilación, para que el compilador pueda asignar memoria para ese tipo específico.
¿Es esta descripción correcta?
Me confunde particularmente con la frase: so that the compiler can allocate memory for that specific type
.
¿Cómo podría un constructor ser virtual
? virtual
significa que el resultado de una llamada a esa función está determinado por el tipo dinámico del objeto. Antes de la construcción, no hay ningún objeto para hacer esto.
La forma en que las frases del tutorial, lo que es un constructor, también es falsa. Debe especificar el tipo exacto; de lo contrario, lo que declara no se considerará un constructor y las funciones sin un tipo de devolución no están permitidas.
Como Bjarne mismo explica aquí
Una llamada virtual es un mecanismo para realizar el trabajo dada información parcial. En particular, "virtual" nos permite llamar a una función que solo conoce las interfaces y no el tipo exacto del objeto. Para crear un objeto, necesitas información completa. En particular, necesita saber el tipo exacto de lo que quiere crear. En consecuencia, una "llamada a un constructor" no puede ser virtual.
El constructor no puede ser virtual porque el estándar lo dice.
El estándar lo dice porque no tendría sentido. ¿Qué haría un constructor virtual?
Los métodos virtuales se usan en polimorfismo ... ¿cómo debería funcionar el polimorfismo si aún no tienes los objetos?
Deberíamos especificar el tipo exacto del objeto en tiempo de compilación, para que el compilador pueda asignar memoria para ese tipo específico.
Deberíamos especificar el tipo exacto en el momento de la compilación porque queremos un objeto de ese tipo ... Encontré su descripción muy confusa también.
Además, en el párrafo no dice que esta es la razón por la cual los constructores no pueden ser virtuales. Explica por qué los métodos virtuales no deberían ser llamados desde el constructor, pero eso es todo.
Es correcto, aunque omita el punto en mi humilde opinión.
Los constructores configuran el despacho virtual, es decir, señalan los punteros correctos en las funciones de la clase actual. Si los constructores pudieran ser virtuales, ¿quién configuraría el constructor virtual de antemano? Habría un problema horrible de huevo y gallina.
Sin embargo, hay una expresión idiomática llamada "constructor virtual", en la que un miembro estático de la clase devuelve un puntero de clase base con una clase adecuada:
class A {
static A* create();
virtual ~A();
};
class B : public A { ... };
A* A::create() { return new B(); }
Para agregar a lo que ya se ha dicho, existe un patrón de diseño de constructor virtual, también conocido como método de fábrica o función de fábrica:
... trata el problema de crear objetos (productos) sin especificar la clase exacta de objeto que se creará