Вызов функции-члена из базового класса

Я читал о делегировании, и я хотел иметь возможность вызывать с базовым классом любой проход функции в качестве параметра в зависимости от события, я сделал это таким образом, и это работает, но я не уверен, является ли это правильным способом, и если это портативный, как это.

class base {
public:
typedef void (base::*methodPTR)();
methodPTR pfn;

void setMethod(methodPTR fn)
{
pfn = fn;
}
void run(){
if(pfn) (this->*pfn)();
}
};

class a : public base {
public:
void fn()
{
cout<<"from class a!"<<endl;
}
};

class b : public base
{
a ob;
public:
void init()
{
ob.setMethod(static_cast<base::methodPTR>(&b::fn));
}

void fn()
{
cout << "from class b!" << endl;
}

void test()
{
ob.run();
}
};

int _tmain(int argc, _TCHAR* argv[])
{
b x;
x.init();
x.test();

return 0;
}

0

Решение

Вы вызываете функцию-член fn класса b с экземпляром класса a что приведет к неопределенному поведению, если вы получите доступ к элементам данных вашего класса.

Замени свои занятия a а также b с этим, чтобы увидеть магию:

class a : public base {
int j;
public:
a()
{
j = 42;
}

void fn()
{
cout<<"from class a!"<<endl;
}
};

class b : public base
{
int i;
a ob;
public:
void init()
{
i = 5;
ob.setMethod(static_cast<base::methodPTR>(&b::fn));
}

void fn()
{
cout << "from class b!" << endl;
cout << "i = " << i << endl;
}

void test()
{
ob.run();
}
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]