Если у меня есть виртуальная функция foo()
, сначала определенная в базовом классе B
, а затем переопределенная в производном классе D
, как я могу сохранить адрес B::foo
в функции-указателе таким образом, чтобы при ее вызове вызов будет вести себя как вызов с квалифицированным идентификатором (например, pd->B::foo()
)?
Пример:
struct B {
virtual int foo() { return 1; }
};
struct D: public B {
virtual int foo() { return 2; }
};
int main(int argc, char * argv[]) {
D* pd = new D();
int (B::*pf)() = &B::foo;
int r = (pd->*pf)();
return 0;
}
Это вызовет D::foo()
. Могу ли я инициализировать pf
таким образом, чтобы (pd->*pf)()
вызывал B::foo()
, даже если динамический тип pd
является классом, который переопределяет foo()
?
(Прежде чем кто-нибудь спросит, я действительно не хочу этого делать, мне просто любопытно, возможно ли это.)
int (*fp)(B &) = [](B & b) { return b.B::foo(); };
- person Kerrek SB   schedule 10.12.2014