C ++ orden de herencia múltiple

Estoy tratando de entender el efecto del orden de herencia en C ++ … Busqué en línea, pero no pude encontrar una respuesta clara y suficiente …

Entonces, por el bien de la pregunta, supongamos que hay 2 clases: clase B y clase C.

Ahora, define:

class A1 : public B, public C{ ... }; class A2 : public C, public B{ ... }; 

¿Cuál es la diferencia entre A1 y A2?

¡Muchas gracias!

El orden de derivación es relevante solo para determinar el orden de inicialización por defecto de los constructores y la limpieza de los destructores.

El orden de derivación no es significativo, excepto lo especificado por la semántica de inicialización por constructor (12.6.2), limpieza (12.4) y diseño de almacenamiento (9.2, 11.1). – nota final] “(§10.1 / 2)

De la documentación de C ++ de IBM: herencia múltiple

El estándar C ++ 11 dice (§10.1):

El orden de derivación no es significativo, excepto lo especificado por la semántica de inicialización por constructor (12.6.2), limpieza (12.4) y diseño de almacenamiento (9.2, 11.1).

Los tres párrafos mencionados revelan que

  • Se llama a los constructores en el orden en que se escriben (la primera clase base en la lista se construye primero) (§12.6.2.10). Se aplican reglas diferentes a las clases base virtuales que siempre se construyen a partir de la clase más derivada antes que cualquier clase base directa.
  • Los destructores se llaman en el orden inverso de construcción (la primera clase base en la lista se destruye en último lugar)
  • El diseño de almacenamiento no está especificado. No debe hacer ninguna suposición sobre el diseño de la clase en la memoria. La única excepción son las llamadas clases de diseño estándar (§9), que es básicamente una estructura de estilo C. Pero dado que no se les permite tener más de una clase con miembros no estáticos en la jerarquía de clases, la pregunta realmente no se aplica aquí.

Tenga en cuenta que el diseño de la memoria puede ser importante. Por ejemplo, si una biblioteca externa realiza conversiones ingenuas de estilo C que suponen que la parte del objeto en el que está interesado está al principio, puede llevar a errores de tiempo de ejecución que son difíciles de depurar.