Following up on this question C++ inheritence and array I have a question about derived classes and their methods.
Currently I have this base class
class FunctionBlock
{
public:
    uint8_t  IN1 : 1 ;
    uint8_t  IN2 : 1 ;
    uint8_t  IN3 : 1 ;
    uint8_t    Q : 1 ;
} ; 
And several derived classes. These are just three out of many
class And : public FunctionBlock
{
public:
    And()
    {
        IN1 = IN2 = IN3 = 1 ;
    }
    void run()
    {
        Q = IN1 & IN2 & IN3 ;
    }
} ;
class Input : public FunctionBlock
{
public:
    Input( uint8_t _pin )
    {
        pin = _pin ;
        pinMode( pin, INPUT_PULLUP ) ;
    }
    uint8_t pin ;
    void run()
    {
        Q = digitalRead( pin ) ;
    }
} ;
class Output : public FunctionBlock
{
public:
    Output ( uint8_t _pin )
    {
        pin = _pin ;
        pinMode( pin, OUTPUT ) ;
    }
    uint8_t pin ;
    void run()
    {
        digitalWrite( pin, IN2 ) ;
    }
} ;
Every last derived class has a run() method.
I made an array of these derived classes and I initialized them.
FunctionBlock *block[ nBlocks ]; 
  
void setup()
{
    block[0] = & Input(1);
    block[1] = & Input(2);
    block[2] = & Input(3);
    block[3] = & And() ;
    block[4] = & Output(4) ;
}
Until so far everything compiles just fine.
But now the problem. I want to run the run() method of every object in the array. Like I said before every object has it's own run() method.
In the main loop() I try this code
void loop()
{
/***************** UPDATE FUNCTION BLOCKS *****************/
    for( int i = 0 ; i < nBlocks ; i ++ ) block[i] -> run() ;
/***************** UPDATE LINKS *****************/
    block[3]->IN2 = block[1]->Q ;  // this compiles
    block[3]->IN1 = block[0]->Q ;
    block[3]->IN3 = block[2]->Q ;
    block[4]->IN2 = block[3]->Q ;
} ;
And that tosses me the following error.
arduinoProgram:153:55: error: 'class FunctionBlock' has no member named 'run'
     for( int i = 0 ; i < nBlocks ; i ++ ) block[i] -> run() ;
                                                       ^~~
I understand what is happening. The main class does not have a run() method. Only the derived classes do. But the array itself is of the main class FunctionBlocks and thus has no acces to the different run() methods.
My question: Is there a construct in C++ with which an array of objects can get access to methods of derived classes? Like I am trying to do in my example
(I compile this program avr-gcc compiler)
EDIT: Despite my lack of knowdledge about object pointers. I have also resolved the memory problem by first declaring the static derived objects and than create the 'functionBlock'array.
#include "functionBlocks.h"
static Input  b1 = Input(1) ;
static Input  b2 = Input(2) ;
static Input  b3 = Input(3) ;
static Or     b4 = Or() ;
static Delay  b5 = Delay( 3000 ) ;
static Output b6 = Output(13) ;
const int nBlocks = 6 ;
FunctionBlock *block[] =
{
    &b1,
    &b2,
    &b3,
    &b4,
    &b5,
    &b6,
} ;
void setup()
{
}
void loop()
{
    block[3] -> IN1 = block[0] -> Q ;
    block[3] -> IN2 = block[1] -> Q ;
    block[3] -> IN3 = block[2] -> Q ;
    block[4] -> IN2 = block[3] -> Q ;
    block[5] -> IN2 = block[4] -> Q ;
/***************** UPDATE FUNCTION BLOCKS *****************/
    for( int i = 0 ; i < nBlocks ; i ++ ) block[i] -> run() ;
} ;
The program now also actually works.
