가상 멤버 함수와 달리, 각 클래스 파생 클래스에서 구현 된 함수를 나중에 기본 클래스에서 호출 할 수 있도록 등록 할 수있는 솔루션이 필요합니다. (가장 파생 된 구현뿐만 아니라)파생 클래스 멤버 함수 포인터를 기본 클래스로 등록하는 방법
이렇게하려면 파생 클래스가 파생 클래스 생성자와 같은 기본 클래스로 해당 함수를 등록하는 메커니즘을 제공 할 생각이었습니다.
회원 함수 포인터 인수에 문제가 있습니다. Derived가 Base에서 파생되었다고 생각했는데 포인터를 자동으로 캐스팅해야합니다.
정적 멤버 함수 인 void *
과 static_cast
을 사용해야합니까?
class Base
{
protected:
typedef void (Base::*PrepFn)(int n);
void registerPrepFn(PrepFn fn) {};
}
class Derived : public Base
{
Derived() {
registerPrepFn(&Derived::derivedPrepFn);
};
void derivedPrepFn(int n) {};
}
컴파일러 오류 :
error: no matching function for call to 'Derived::registerPrepFn(void (Derived::*)(int))'
note: candidates are: 'void Base::registerPrepFn(void (Base::*)(int))'
정확히 무엇을하고 싶은지 잘 모르겠습니다. 그러나 이것은 확실히 불가능합니다. 'Derived '에 정의 된 멤버 함수는'Base :: *'에 의해 가리킬 수 없다. 아마도 최상위 수준의 목표를 설명하면 누군가가 더 나은 솔루션을 제안 할 수 있습니다. –
FTR,'void *'및'static_cast'는 멤버 함수에 대한 포인터가 포인터가 아니기 때문에 작동하지 않습니다 (예, 끔찍한 이름입니다). –
정적 캐스트에 관한, 나는 정적 멤버 함수를 구현할 수 있고이 포인터 주위를 명시 적으로 전달할 수 있다고 생각했습니다. – NoahR