Сообщение Re: Вызов виртуальной функции с параметром со знач-м, заданн от 02.03.2021 19:46
Изменено 05.03.2021 16:49 vopl
Re: Вызов функции с параметром со знач-м, заданным по-умолчанию.
Здравствуйте, centos, Вы писали:
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?
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>Вывод:
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?
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?