Invocando Contratos padres
WEB3DEV Team   
# Invocando Contratos padres
Contratos padres pueden ser invocados directamente o usando la palabra reservada super.
Usando la palabra reservada super, todos los contratos padres inmediatos serán invocados.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
/* Árbol de herencia
   A
 /  \
B   C
 \ /
  D
*/
contract A {
    // Esto es llamado un evento. Tu puedes emitir eventos desde tu función
    // y ellos son registrados en el log de transacción.
    // En nuestro caso, esto será útil para rastrear llamadas de función.
    event Log(string message);
    function foo() public virtual {
        emit Log("A.foo called");
    }
    function bar() public virtual {
        emit Log("A.bar called");
    }
}
contract B is A {
    function foo() public virtual override {
        emit Log("B.foo called");
        A.foo();
    }
    function bar() public virtual override {
        emit Log("B.bar called");
        super.bar();
    }
}
contract C is A {
    function foo() public virtual override {
        emit Log("C.foo called");
        A.foo();
    }
    function bar() public virtual override {
        emit Log("C.bar called");
        super.bar();
    }
}
contract D is B, C {
    // Intenta:
    // - Llama a D.foo y revisa los logs de la transacción.
    //   Si bien D hereda A, B y C, solo se llamó a C y después A. 
    // - Llama a D.bar y revisa los logs de la transacción
    //   D llamó a C, después B, y finalmente A.
    //   Sin embargo super fue invocado 2 veces (por B e C) y solo llamó a A una vez.
    function foo() public override(B, C) {
        super.foo();
    }
    function bar() public override(B, C) {
        super.bar();
    }
}