Информация об изменениях

Сообщение Re: Вызов виртуальной функции с параметром со знач-м, заданн от 02.03.2021 19:46

Изменено 05.03.2021 16:49 vopl

Re: Вызов функции с параметром со знач-м, заданным по-умолчанию.
Здравствуйте, centos, Вы писали:


C>
C>class A
C>{
C>public:
C>    A()
C>    {
C>        f();
C>    }
C>    void f(int i = 10)
C>    {
C>        std::cout << i << '\n';
C>    }
C>};

C>class B: public A
C>{
C>public:
C>    B()
C>    {
C>        f();
C>    }
C>    void f(int i = 25)
C>    {
C>        std::cout << "B::f " << i << '\n';
C>    }
C>};

C>int main()
C>{
C>    B b;
C>    A& a = b;
C>    a.f();
C>}
C>


C>Вывод:

C>10

недостроенный most-derived B находится на стадии конструирования базы А, в этом случае все его виртуальные методы ссылаются максимум на самого А, поэтому отрабатывает тело A::f. Это тело вызывается по сигнатуре A::f, поэтому использовалось значение аргумента 10

C>B::f 25


теперь А уже закончил конструироваться, работает тело конструктора B, в этом случае все его виртуальные методы уже ссылаются на соответствующие реализации методов в В, поэтому отрабатывает тело В::f. Это тело вызывается по сигнатуре В::f, поэтому использовалось значение 25

C>B::f 10


для most-derived B по сигнатуре A::f вызывается виртуальный f. Так как он виртуальный — то работает тело B::f. Так как сигнатура вызова была A::f — то из нее взялось значение аргумента 10.

C>Почему в 3-й строчке была вызвана B::f со значением 10?
Re: Вызов виртуальной функции с параметром со знач-м, заданн
Здравствуйте, centos, Вы писали:


C>
C>class A
C>{
C>public:
C>    A()
C>    {
C>        f();
C>    }
C>    virtual void f(int i = 10)
C>    {
C>        std::cout << i << '\n';
C>    }
C>};

C>class B: public A
C>{
C>public:
C>    B()
C>    {
C>        f();
C>    }
C>    virtual void f(int i = 25) override
C>    {
C>        std::cout << "B::f " << i << '\n';
C>    }
C>};

C>int main()
C>{
C>    B b;
C>    A& a = b;
C>    a.f();
C>}
C>


C>Вывод:

C>10

недостроенный most-derived B находится на стадии конструирования базы А, в этом случае все его виртуальные методы ссылаются максимум на самого А, поэтому отрабатывает тело A::f. Это тело вызывается по сигнатуре A::f, поэтому использовалось значение аргумента 10

C>B::f 25


теперь А уже закончил конструироваться, работает тело конструктора B, в этом случае все его виртуальные методы уже ссылаются на соответствующие реализации методов в В, поэтому отрабатывает тело В::f. Это тело вызывается по сигнатуре В::f, поэтому использовалось значение 25

C>B::f 10


для most-derived B по сигнатуре A::f вызывается виртуальный f. Так как он виртуальный — то работает тело B::f. Так как сигнатура вызова была A::f — то из нее взялось значение аргумента 10.

C>Почему в 3-й строчке была вызвана B::f со значением 10?