Вызов функции производного класса из базового класса без использования виртуальных функций - PullRequest
0 голосов
/ 03 октября 2011

Привет, предположим, у меня есть такой код

// base class                                                                                                                                                

    class A {

    public:

      int CallMyFct(PtrToFCT what){
        return what(10);
      }

    };

    class B : public A {
      int myInt;

    public:
      B():myInt(10){}

      int myFct1(int val){
        return myInt+val;
      }

      int myFct2(int val){
        return myInt*2+val;
      }


      void Call(void){
        int rez1=CallMyFct(&myFct1);
        if (rez1!=20)
          cout << "You are wrong" << endl;

        int rez2=CallMyFct(&myFct2);
        if (rez2!=30)
          cout << "You are wrong" << endl;
      }

    };

Теперь мне нужно вызвать эти MyFct1, MyFct2 и т. Д. Из базового класса, но я не могу использовать виртуальные функции. Так что это как инверсия наследования. Я не знаю, возможно ли это. Как вы думаете, mem_fun или любая другая функция адаптера будет работать здесь.

Мне на самом деле нужно выяснить, что будет с этим PtrToFCT и как мне передать myFct1 в CallMyFCT.

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Вы должны определить функции, которые будут вызываться как static, и предоставить дополнительный параметр для передачи им экземпляру объекта (вместо this, который они получат, если будут вызываться как обычные функции-члены).

0 голосов
/ 04 октября 2011

Вы можете делать то, что вам больше нравится, с помощью [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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...