05 August, 2013

С++ задачка

Еще одна задача на тонкости C++,
что выведет этот код?

#include <QtDebug>

class A {
public:
    virtual void foo(int i = 1)
    {
        qDebug() << "A" << i;
    }
};

class B : public A {
public:
    virtual void foo(int i = 100) override
    {
        qDebug() << "B" << i;
    }
};

int main()
{
    A *b = new B();
    B *bb = dynamic_cast<B *>(b);
    b->foo();
    bb->foo();
    return 0;
}

Ответ внутри

Ответ(Выделите ниже):  
B 1
B 100
Такой странный ответ получается потому, что дефолтный параметр подставляется во время компиляции, а метод для вызова выбирается в рантайме.

1 comment:

  1. Все таки очень плохая практика писать аргумент со значением по умолчанию для виртуальной функции.
    А сама задачка интересная - из разряда тех, что наглядно проверяют насколько ты понимаешь как все работает внутри.

    ReplyDelete