#define DEF_FUNC_NUM 10

template< typename T >
class A
{
    // T 클래스의 함수 포인터를 DEF_FUNC_NUM 수 만큼 저장할 배열
    int ( T :: * m_fpWork [ DEF_FUNC_NUM ] )( int, int );

    // 함수 포인터를 저장 함수
    void SetFunc( int iFuncPos, int ( T :: * fpWork )( int, int ) )
    {
        m_fpWork [ iFuncPos ] = fpWork;
    }

    //함수포인터를 사용 함수 (클래스의 함수 포인터는 클래스 내부에서만 사용가능)
    int RunFunc( int iFuncPos, int iValueA, int iValueB )
    {
        int iReturn = 0;
        // ( T *const ) this : 부모의 포인터를 자식의 포인터로 형변환
        iReturn = ( ( T *const ) this ->* m_fpWork [ iFuncPos ] )( iValueA, iValueB );
        return iReturn;
    }
};

//A<B>를 상속받은 B 클래스
class B : A < B >
{
    // 생성자에서 함수포인터에 함수를 넣어줌
    B()
    {
        // 저장
        SetFunc( 0, &B::FuncA );
        SetFunc( 1, &B::FuncB );
    }
    // 생성자에서 저장한 함수를 사용
    int AllRunFunc( int iValueA, int iValueB )
    {
        int iReturn = 0;
        // 사용
        iReturn += RunFunc( 0, iValueA, iValueB );
        iReturn += RunFunc( 1, iValueA, iValueB );
        return iReturn;
    }

    //저장하고 사용할 함수
    int FuncA( int iValueA, int iValueB )
    {
        return iValueA + iValueB;
    }
    int FuncB( int iValueA, int iValueB )
    {
        return iValueA - iValueB;
    }
};

 

내코드를 보고 간추리면서 작성한코드라 test는 해보지 않았다
(내코드는 잘돌아간다)

간략 설며을 붙이자면
A클래스는 부모클래스로서
자식클래스의 함수를 사용하고 싶고
버츄얼 함수로 작성해도 돼지만
그렇다면 함수 추가시
부모쪽에도 함수를 추가해 주어야하는
불편함에 함수포인터 배열로 관리하였다

이해를 돕기위해 배열을 사용하였으며
부모쪽에서 함수포인터를 동적할당하여 관리하여도 무방하다

참고로 내가 사용한 case는
network recv시 해더에 따른 함수를 호출할때 사용하였으며
A클래스는 network 기본 클래스이고
B클래스는 응용 프로그램을 조작하는 network 함수들을 작성하였다

* (클래스의 함수 포인터는 클래스 내부에서만 사용가능)
 ( this ->* m_fpWork )( iValueA, iValueB ); // <- 이런 방식으로 사용

* [ ->* ] 이건 하나의 연산자로 띄어쓰기 불가능: [ -> * ](X),[ ->* ](O)