Очевидно, вы неправильно понимаете значение this->*
в вызове в FOO
.
Когда вы используете this->*
с указателем члена fptr
, часть this->*
не имеет абсолютно никакого отношения к fptr
, являющемуся членом FOO
. Когда вы вызываете функцию-член, используя указатель на член, вы должны использовать оператор ->*
(или оператор .*
), и вам всегда необходимо указать фактический объект, который вы хотите использовать с этот указатель на член. Это то, что делает this->*
часть вызывающего выражения. То есть вызов будет всегда выглядеть как
(<pointer-to-object> ->* <pointer-to-member>) (<arguments>)
или как
(<object> .* <pointer-to-member>) (<arguments>)
Левая сторона вызова (<pointer-to-object>
или <object>
выше) не может быть опущена.
Другими словами, не имеет значения, является ли fptr
переменной-членом, локальной переменной, глобальной переменной или любой другой переменной, вызов через fptr
будет всегда выглядеть как
(this->*fptr)(a, b);
при условии, что вы хотите вызвать его с *this
объектом. Если в другом примере вы хотите вызвать его для какого-либо другого объекта, на который указывает указатель pfoo
, вызов будет выглядеть следующим образом
FOO *pfoo;
...
(pfoo->*fptr)(a, b);
В вашем классе BAR
вызов должен выглядеть как (this->*fptr)(a,b)
, хотя fptr
является локальной переменной.