Что значит?

92

У меня 2 класса:

class base {
    virtual void foo() {};
};

class derived : public base {
    void foo() { base::foo(); }
};

Я ошибся и написал base:foo();вместо base::foo();. Код был скомпилирован и запущен, но произошел сбой.

Я не знаю, как я могу это найти в Google, и не знаю, что это такое, но мне очень интересно: что это значит?

base:foo();

Если это важно:

class base : public QAbstractGraphicsShapeItem
Railmisaka
источник
32
Это ярлык .
Крис
20
Это тот случай, когда включение предупреждений помогает, посмотрите это вживую ... warning: label 'base' defined but not used [-Wunused-label]... возможно, нам нужно добавить эту страницу с вопросом: Вы пробовали включить предупреждения
Шафик Ягмур
6
Это закончилось переполнением стека. Как уместно!
Laurent LA RIZZA

Ответы:

125
void foo() { base:foo(); }

эквивалентно:

void foo()
{
   base: // An unused label.
   foo(); // Calls the function again, resulting in infinite recursion.
}

Из-за бесконечной рекурсии функция вызывает переполнение стека.

R Саху
источник
1
да, я обнаружил эту ошибку, когда увидел много вызовов функции foo()в стеке вызовов. спасибо
railmisaka
есть ли предупреждения об этом в gcc / clang и т. д.?
чушь
10
@Serthy, при использовании -Wallполучаю предупреждающее сообщение: socc.cc:3:4: warning: label 'base' определен, но не используется [-Wunused-label] base: // Неиспользуемый ярлык.
R Sahu
10
@Serthy: IIRC Visual Studio для этого имеет предупреждение «рекурсивно на всех путях управления».
MSalters