= 10){cout << "Base::" << n << endl;}
};
class Derived : public Base{
public:
void f(int n = 20) override{cout << "Derived::" << n << endl;}
};
int main() {
Base* b = new Derived;
b->f();
// Derived::10
// WTF?!?!
delete b;
return 0;
}
потому что: virtual void f(int n = 10)
Потому что дефолтные значения вычисляются в точке вызова, а в точке вызова компилятор статически видит Base, а не Derived
Какие чудесные грабли... Неплохой вопрос для собесов :))
так это я с собеса вышел только что:))
ты надеюсь ответил, что если у вас такой код, мне у вас делать нечего? и презрительно захлопнул за собой дверь
это был тест, который мне дали решать за 1 час
Может они спрашивают чтобы отсеить людей, для которых это нормально)
Обсуждают сегодня