Благодарю за проявленный интерес, но вопрос отпал сам собой (текст и названия классов изменились, но суть осталась прежней):
#include <stdio.h>
#define BYTE char
class Handler{
public:
Handler(){};
virtual void handler() = 0; // будущий обработчик
void intro(){ // точка входа в обработчик события.
(this->*handler)();
}; // здесь осуществляется вызов внешнего метода (служащего обработчиком) через указатель
};
////////////////////////////////////
class A: public Handler{
public:
A(){};
void handler(){printf("\nA.func");};
};
class ExtInt: public Handler{
public:
ExtInt(){};
~ExtInt(){};
virtual void setHandler(char, Handler *) = 0;
virtual void portHandler() = 0; // сюда попадаем от внещнего прерывания
virtual void handler() = 0;
};
class ExtInt1: public ExtInt{
private:
Handler *handlers[8]; // массив указателей обработчиков,
// закрепленных за каждым каналом (битом) Порта 1
public:
ExtInt1();
~ExtInt1();
void setHandler(BYTE, Handler *);
void enableInt(BYTE);
void disableInt(BYTE);
void portHandler();
void handler();
};
ExtInt1::ExtInt1()
{
char i;
for (i = 0; i < 8; i++)
handlers[i] = 0;
}
ExtInt1::~ExtInt1()
{
}
void ExtInt1::setHandler(char pin, Handler *ph) // установим соответствие: номер пина - объект-обработчик события
{
handlers[pin] = ph; // заполним ячейку объектом
};
void ExtInt1::enableInt(BYTE pin)
{
}
void ExtInt1::disableInt(BYTE pin)
{
}
void ExtInt1::portHandler() // сюда попадаем от внещнего прерывания
{
char c = 1;
if (handlers[c] != NULL) // обработчик события должен существовать
handlers[c]->intro(); // передаем управление точке входа
}
void ExtInt1::handler()
{
printf("\nExtInt.handler()");
}
/////////////////////////////////
void main()
{
A a;
ExtInt1 extint1;
extint1.setHandler(1, &a);
extint1.portHandler();
extint1.setHandler(1, &extint1);
extint1.portHandler();
}
внешнее прерывание что вроде (это писано вообще для микроконтроллеров MSP430 в среде IAR):
/**
* Этот объект используется для работы с внешним прерыванием (Порт 1)
*
*/
extern ExtInt1 extint1;
/**
* Процедура обработки внешнего преравания (Порт 1)
* Передает управление методу класса ExtInt1::portHandler()
*/
#pragma vector=PORT1_VECTOR
__interrupt void Port1()
{
extint1->portHandler();
}