Вы можете делать то, что вам больше нравится, с помощью [boost::function<>]
1 , также известного как std::function
из <functional>
в C ++ 2011. Вы не заявляете, почему вы не можете использовать виртуальные функции. Не ясно, что этот метод обеспечивает повышение производительности по сравнению с виртуальными функциями, но есть и другие причины не использовать виртуальные функции.
В любом случае это соответствует (моя интерпретация) вашим требованиям к вызову функций из базового класса, которые ведут себя по-разному в зависимости от фактического производного класса без использования виртуальных функций. Ваш пример желаемого использования мне не совсем понятен. Если этот механизм не отвечает вашим потребностям, уточните потребности.
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
class A{
protected:
typedef boost::function<int (int)> CallbackFunc;
// A knows it can call *something* with a particular signature
// but what is called can be overridden by the derived class.
CallbackFunc m_callbackFunc;
public:
A()
{
m_callbackFunc = boost::bind(&A::same,this,_1);
}
int same(int val) const { return val; }
int simulateVirtual(int val) const { return m_callbackFunc(val); }
}; //end class A
class B : public A {
int m_offset;
public:
B(int offset) : m_offset(offset) {
m_callbackFunc = boost::bind(&B::offset,this,_1);
}
int offset(int val) const { return m_offset + val; }
}; // end class B
int main() {
A* pA = new A;
A* pB = new B(42);
std::cout << "simulateVirtual(10) called on a 'real' A instance="
<< pA->simulateVirtual(10) << "\n";
std::cout << "simulateVirtual(10) called via A* on a B instance="
<< pB->simulateVirtual(10) << "\n";
delete pB; // in real life I would use shared_ptr<>
delete pA;
return 0;
} // end main