Это связано с моей нитью Member Указатели функций и наследование на allegro.cchere.Как мне вызвать метод базового класса с помощью указателя на функцию-член?
См. Тему на allegro.cc для примеров кода.
Я пытаюсь вызвать метод базового класса с помощью указателя функции-члена по виртуальному методу в моем классе WidgetBase
. Однако он вызывает виртуальный метод вместо базового класса. Я хочу вызвать метод базового класса с помощью указателя на функцию, но в соответствии с другими потоками здесь при переполнении стека это невозможно.
Итак, мой вопрос в том, какие альтернативы существуют? Lambdas были предложены, но я не уверен, как это реализовать, поскольку у меня мало опыта работы с C++ 11 или C++ 14. Идеи приветствуются.
Можно вызвать метод базового класса, если вызывающий объект на самом деле является экземпляром класса Base
, но это вызывает проблемы, поскольку оно включает в себя создание копии объекта, на который я хочу вызвать метод, который побеждает цель называть его на объекте для начала.
Я надеялся, что был какой-то магический притвор, который я мог бы использовать для его реализации, но использование статического приведения в базовый класс делает временную копию объекта, что опять же не то, что я хочу.
Я хочу использовать это для реализации вспомогательной функции в моем классе TextDecorator
, который вызовет предварительно выбранную функцию настройки состояния на нескольких различных объектах, содержащихся в TextDecorator
. TextDecorator
получен из WidgetDecoratorBase
, который получен из WidgetBase
, где функции базового класса, которые я хочу вызвать, находятся. Эта вспомогательная функция затем будет вызываться в переопределенных версиях функций настройки состояния в классе TextDecorator
.
В общем, что я хочу в псевдо C++ код следующим образом:
void TextDecorator::SetFlagState(bool state , void (WidgetBase::*StateSetter)(bool)) {
if (basic_text_widget) {
(basic_text_widget->WidgetBase::*StateSetter)(state);
}
(text_widget_layout->WidgetBase::->*StateSetter)(state);
(this->WidgetDecoratorBase::->*StateSetter)(state);
}
Что бы тогда позвольте мне сделать настройки мое состояние вызовов в TextDecorator
ясной и краткой, который будет называться так:
void TextDecorator::SetEnabledState(bool state) {
SetFlagState(state , SetEnabledState);
}
, где SetEnabledState
является одной из функций виртуального состояния в моем классе WidgetBase
.
Пожалуйста, оставляйте предложения только для возможных путей его реализации. Должен быть чистый лаконичный способ сделать это на C++.
Вы говорите: «Должен быть чистый точный способ сделать это», и вы ошибаетесь. По сути, вы пытаетесь обойти предполагаемую работу языковой функции (что вызов через указатель на функцию-член вызывает самую производную версию, если она виртуальна), в функции, которая не была предоставлена с информацией, необходимой для делайте то, что вы намерены. – Peter
@Peter - это четкий контроль над C++, если нет способа вызвать определенную функцию-член через указатель функции-члена. В большинстве случаев вызов производной функции был бы правильным, но в этом случае это не так, и если C++ не предусматривает этого, то он не соответствует imho. У меня есть вера, есть чистый лаконичный способ сделать это, я просто не знаю, что это такое. Он может не включать указатели на функцию-член, но я никогда не говорил, что это должно быть сделано именно так. Кто-то предложил лямбда-функции, но у меня нет достаточного опыта, чтобы они знали, как это сделать. Отсюда призыв к помощи. – MarcD
Извините, MarcD, не так. Большая часть точек виртуальных функций - это то, что они разрешают версию функции, соответствующую объекту ACTUAL, а не унаследованную версию. Это фундаментальная основа полиморфизма. Это ваше требование является ошибочным. – Peter