Доступны указатели на функции-члены, которые делают именно то, что вы хотите.Тем не менее, просто имейте в виду, что они на самом деле не являются «указателями», а «похожи на указатели», поскольку возможно , что правильный поиск / вызов должен проходить через таблицу (и) «vptr», связанную скласс, который может иметь более одного родителя.
Короче говоря: Да, вы можете иметь его.Если вы реализуете в шаблоне, вам не нужно включать целевые заголовки (но вам потребуется , чтобы реализовать заголовки целевого класса в точке расширения кода).Если вы реализуете как не шаблон, то вы можете объявить функции-члены и заставить их работать.Или вы можете просто включить целевые заголовки типа класса.
Поскольку доступно несколько целевых функций, да, в точке фактической привязки вы должны включить заголовок (вам не нужен заголовок, если этоявляется реализацией шаблона):
class MyA {
public:
bool foo1(int) const;
bool foo2(int) const;
};
void MyFunc(void) {
bool (MyA::*my_ptr_to_func)(int) const;
my_ptr_to_func = &MyA::foo2;
MyA my_a;
// call it
if((my_a.*my_ptr_to_func)(42))
{
// ...
}
}
[ОБНОВЛЕНИЕ] , основываясь на обновленном коде, кажется, что вы просто хотите сделать "bool B::check(int) const
" равным "virtual
"в базовом классе и переопределить / повторно реализовать эту функцию в производных классах" C1
"и" C2
"?
Да, будет вызвана функция virtual
(реализация вклассы C1
и C2
), хотя указатель изначально был на функцию B::check(int)
.Это работает, и это точно , почему функция указателя на член не является точно указателем, но похожа на указатель (чтобы разрешить ваш вызовправильно выполнить код virtual
в производных классах).
Так что, не бойтесь: все будет работать, просто поместите "virtual
" на B::check(int)
в базе.