If you're not very experienced with these more complicated dynamic object oriented programming designs. You can do a practice run in plain C. C++ is easier, since object oriented is more in the purpose of c++.
Think of a routine that read a finite amount of inputs, with a finite amount of conditions, and a finite amount of outputs.
Now take all the variables used to execute that function, and put them in a 3 typedef structures or classes.
Input_t, Expression_t and Output_t.
Where Input describes the type of input (current/voltage/boolean/time),
Expression contains some operation and a parameter (equals to, is greater than or is within) the Input to use and the Output to perform.
And Output defines the hardware to use as output, a GPIO, dac or adc or timer. Generally, Input_t and Output_t are const because they're hardware specific, and are only referenced by pointers. They'll use a generic approach, for example a word defining the status and an enum defining the type. Or with C++, an ADC output derives from an virtual Output interface class.
Now you can use 1 piece of code to run on multiple pieces of datasets.
Next, you'll need to write smarts that parses a line like:
[If][Signal#1][>][1.34V][then][output1][true];
set expression to greaterthan.
set input to signal1.
set expression parameter to 1.34.
set output to output1.
set output parameter to boolean.
Into the structures you're using in your logic table.
Basically you run the array of Expression_t's through your routine, and you're done.
Not the most beautiful solution, but it works.
Aren't there any related topic or excellent examples on this kind of software architecture in C and C++.
Because in unitversity, you don't learn to program like this. They only skip over the language features. You'll have to be creative yourself to build fancy code with it.