То, что вы ищете, это указатель на (виртуальную) функцию-член . Обратите внимание, что такой указатель не является адресом функции, но обычно является смещением внутри vtable, так как фактическая вызываемая функция зависит от реального типа объекта. Вы даже не можете указать этот указатель на void*
, представление определено реализацией. Это также означает, что вы не можете найти адрес фактической функции, которая будет вызываться общим способом .
Если вам действительно нужно знать целевую функцию для вызова, возможно, вы было бы лучше, используя несколько отдельных функций и enum?
В любом случае, если вы просто хотите, чтобы вы могли вызвать функцию виртуального члена через указатель, вы можете сделать что-то вроде этого:
void someOtherFunction(Base* pb)
{
using func_t = void(Base::*)(); // Type of a pointer to member function of
// signature void() and object type Base
func_t fn = &Base::method1; // Take the address of the function
(pb->*fn)(); // Call it. Note the extra parenthesis and the operator: ->*
// The actual function called depends on the actual type of pb,
// it can be Derived1::f() or Derived2::f() in the example code you have
}
DataContext
в MainWindow
не является DataContext
в Page
в Frame
. Вы можете установить DataContext фрейма программно, хотя:
Page
в Frame
автоматически не наследует DataContext
из MainWindow
, но вы можете установить его свойство DataContext
когда вы загружаете Page
:
Home home = new Home();
home.DataContext = viewModel;
MyFrame.Content = home;