Что значит?


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

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.
}

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.