es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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.

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.