¿Mi herencia es lo mismo que la problemática “herencia diamante”?
Tengo múltiples clases base virtuales que crean interfaces para mis clases de implementación. Sin embargo, quiero que todas ellas puedan serializarse y deserializarse. Esto da como resultado la siguiente herencia de ABC:
Supongamos que tengo la clase A que permite la serialización y deserialización de la clase.
class A{
virtual void serialize() = 0;
virtual void deserialize() = 0;
}
Tengo una clase B que agrega algunas llamadas virtuales, pero también debe poder manejar sus propias operaciones de serialización:
class B : public A {
B() : A() {
some_variable_B_responsable_for = 0;
}
// heredado de A
virtual void serialize() {}
virtual void deserialize() {}
virtual void Bfunction() = 0;
private:
int some_variable_B_responsable_for;
}
Ahora tengo una clase C que implementa funcionalidad tanto de A como de B, en el patrón de:
A
^ ^
| |
| B
| ^
| |
C
class C : public A, public B{
C() : A(), B() {
}
virtual void serialize() {
// hacer mi propia serialización
B::serialize(); // llamar a la serialización de B
}
virtual void deserialize() {
// hacer mi propia deserialización
B::deserialize(); // llamar a la deserialización de B
}
virtual void Bfunction() {
// implementar la interfaz
}
}
¿Esto funcionará o hay algo mal en mi razonamiento? Quiero delegar la serialización y deserialización a todas las implementaciones de clase para que no haya representaciones diferentes para la misma clase base.
davy.ai
Tu razonamiento es correcto. Al heredar de A y B, la clase C hereda los métodos serialize y deserialize de A y también agrega su propia implementación en los métodos serialize y deserialize de C. Las llamadas a los métodos serialize y deserialize de B se delegan correctamente desde los métodos de C a los métodos de B. De esta manera, todas las implementaciones de A y B tendrán el mismo comportamiento de serialización y deserialización, asegurando que no habrá representaciones diferentes para la misma clase base.