Как я могу избежать вызова статической функции (и вместо этого вызвать базовую функцию-член)?

У меня есть статический экземпляр (ранее называвшийся синглтоном, но комментаторы недовольны этим) класса, который является производным от базового класса. Все идет нормально.

Derived имеет статическую функцию fun, а Base имеет функцию-член fun (не спрашивайте). Очевидно, что вызов instance->fun() в Derived::fun() создаёт бесконечную рекурсию, заканчивающуюся переполнением стека.

Мне удалось избежать этого, позвонив вместо этого ((Base*)instance)->fun():

struct Base {
    void fun() { /* ... */ }
};

struct Derived;

static Derived * instance = nullptr;

struct Derived : Base {
    static void fun() {
        // stack overflow!
        // instance->fun();

        // works!
        ((Base*)instance)->fun();
    }
};

int main() {
    instance = new Derived();
    Derived::fun();
}

Есть ли лучший способ избежать вызова статической функции, определенной в Derived?

static здесь ни на что не влияет; та же проблема может возникнуть с нестатической функцией-членом. Проблема в поиске имени.

Pete Becker 23.07.2024 20:21

почему ты думаешь, что тебе нужно что-то лучше?

463035818_is_not_an_ai 23.07.2024 20:26

«У меня есть синглтон» Тебя здесь нет. Выбор создания одного объекта не делает его одноэлементным.

Drew Dormann 23.07.2024 20:48

@DrewDormann - это, очевидно, квинтэссенция проблемы, а не дословное воспроизведение. Вот как это должно быть.

Pete Becker 23.07.2024 21:01

@PeteBecker, разве очевидная квинтэссенция этой проблемы не будет иметь синглтонов? Это не вопрос об одиночках. Я вижу непонимание терминологии, но, возможно, я ошибаюсь.

Drew Dormann 23.07.2024 21:13

@DrewDormann - очевидно, что в исходном коде использовался синглтон, и при перегонке было удалено все, что делает его синглтоном, кроме имени указателя. Одна из худших особенностей Stackoverflow — люди, которые настаивают на своей версии точности, несмотря на то, что вопрос совершенно ясен. Просто притворитесь, что здесь нет упоминания о «синглтоне», и вы, вероятно, лучше поймете вопрос.

Pete Becker 23.07.2024 22:25

@463035818_is_not_an_ai интуитивное чувство. На самом деле, я всегда задаюсь вопросом, есть ли что-то лучше, даже если у меня нет для этого конкретной причины. И, глядя на ответ Юджина, я чувствую, что моя интуиция была верной.

bers 24.07.2024 06:53

«Просто притворитесь, что здесь нет упоминания о «синглтоне», и вы, вероятно, лучше поймете вопрос». - @PeteBecker попал в точку. Я удалил из вопроса термин «синглтон», назвав вместо него переменную instance.

bers 24.07.2024 06:54

Если вы спрашиваете, как вызвать метод базового класса с той же сигнатурой, что и метод производного класса, вот ответ: stackoverflow.com/a/357380/19871088

David Franc 23.07.2024 21:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете вызвать функцию instance->Base::fun().

Другие вопросы по теме