pregunta básica de C++ estoy bastante seguro. si tengo una clase base con un constructor que no toma parámetros, y solo inicializa algunos de los miembros protegidos, una clase derivada llamará instantáneamente a este constructor base si coincide con los parámetros (ilusión pero poco probable), y si no es así, ¿Hay alguna manera de forzarlo a que llame automáticamente a dicho constructor base desde la clase derivada SIN tener que decirle explícitamente que lo haga en la clase derivada? Pregunto porque estoy escribiendo un tipo de contenedor y hay algunos miembros protegidos que quiero inicializar a valores específicos inicialmente, y luego quiero derivar y manipular esta clase base para mis necesidades, pero no me gustaría un usuario externo tener que recordar llamar explícitamente al constructor base o establecer estos valores dentro de su propio constructor.cómo forzar a los constructores de la clase base a llamar en clases derivadas?
Respuesta
Sí, siempre se invoca el constructor base predeterminado a menos que se indique explícitamente lo contrario.
Por ejemplo:
class A
{
public:
A() { std::cout << "A"; }
};
class B : A
{
public:
B() {}
};
int main()
{
B b;
return 0;
}
la Salida:
A
Por "indique expresamente lo contrario" quiero decir que se puede llamar un constructor diferente de la clase derivada:
class A
{
public:
A() { std::cout << "A"; }
A(int) { std::cout << "AAA"; }
};
class B : A
{
public:
B() : A(1) {} //call A(int)
};
int main()
{
B b;
return 0;
}
dará salida
AAA
Importante si usted no tiene un constructor por defecto (que declarar un constructor no predeterminado y no una opción por defecto) o el constructor por defecto no es visible (marcado como private
), es necesario llamar explícitamente a una constructor disponible en la clase derivada.
digamos que la única clase de constructor A tiene, recibe un entero como parámetro, y luego la clase derivada tiene un constructor que también recibe un int único. ¿Se llamará también al constructor de la base por casualidad? ¿o un constructor solo se considera un constructor predeterminado si no tiene parámetros? – FatalCatharsis
también, últimas ideas, si es al revés, donde definió un constructor con parámetros en B pero un constructor sin parámetros en A, ¿se llamaría al constructor de A? y también, que se llama primero, el constructor predeterminado de la clase base o el constructor predeterminado de la clase derivada. – FatalCatharsis
Si su clase base tiene un "constructor predeterminado" (un constructor que no toma parámetros, ya sea explícitamente provisto por usted o implícitamente provisto por el compilador porque no proporcionó ningún constructor explícitamente), entonces cada derivada El constructor de clases llamará automáticamente a eso a menos que especifiques que llaman a un constructor diferente.
(Si su base de clase no lo hace tienen un "constructor por defecto", ya que ha proporcionado uno o más constructores que toman parámetros y ningún constructor que no lo hace, entonces es una compilación de error para una constructor de clase derivada para no indicar el constructor de clase base que llama.)
- 1. Cómo llamar a métodos anulado en todas las clases derivadas
- 2. Manipular con punteros a objetos de clases derivadas a través de punteros a clase base objetos
- 3. Llamar implícitamente a los constructores principales
- 4. Levantar eventos de clase base en clases derivadas C#
- 5. ¿Cómo puedo forzar al constructor base a llamarse en C#?
- 6. ¿Llamar explícitamente a base() en constructores derivados es opcional?
- 7. TypeID para las clases derivadas de una clase base común
- 8. Campos estáticos en una clase base y clases derivadas
- 9. Llamar a Métodos anulado en clase derivada de la clase Base
- 10. no puede llamar a funciones protegidas de clase base?
- 11. ¿Cómo forzar a la clase derivada a llamar al supermétodo? (Como Android lo hace)
- 12. ¿Múltiples clases abstractas derivadas?
- 13. Fuerza llamar a la clase base función virtual
- 14. enumeración de las clases derivadas
- 15. Herramienta para fusionar clases de C# base y derivadas
- 16. Convertir clase base a clase derivada
- 17. C++: Llamar a la función virtual de la clase derivada
- 18. ¿Debo llamar a super() o llamar a this() para los constructores de vista personalizada de Android?
- 19. ¿Cómo llamar correctamente a los métodos de clase base (y al constructor) de clases heredadas en Python?
- 20. ¿Cómo llamar correctamente al constructor de la clase base de la clase heredada en Delphi Phrism?
- 21. ¿Hay alguna forma en C# para forzar la sobrecarga del operador en clases derivadas?
- 22. Clase derivada de fuerza para llamar a la función base
- 23. ¿Cómo forzar a moq a llamar al constructor?
- 24. ¿Configurar en clases derivadas con NUnit?
- 25. ¿Llamar a una función anulada de una clase base?
- 26. C++ LNK2019 error con constructores y destructores en las clases derivadas
- 27. ¿Es posible pasar clases derivadas por referencia a una función que toma la clase base como un parámetro
- 28. C#: Adición de métodos de extensión a una clase de base de modo que aparezcan en las clases derivadas
- 29. Envoltura C++ en C: derivadas a conversiones base
- 30. ¿Forzar a los constructores de argumento único a ser explícitos en C++?
Estoy un poco perdido con la redacción de su pregunta, pero si la clase base tiene un constructor predeterminado/sin argumentos, se ejecutará cuando Inicializa un objeto de clase derivado si no especifica explícitamente la inicialización de la clase base. – birryree