Вызов функции с параметром со знач-м, заданным по-умолчанию.
От: centos Россия  
Дата: 02.03.21 19:12
Оценка:
class A
{
public:
    A()
    {
        f();
    }
    virtual void f(int i = 10)
    {
        std::cout << i << '\n';
    }
};

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

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


Вывод:
10
B::f 25
B::f 10
Почему в 3-й строчке была вызвана B::f со значением 10?
Отредактировано 07.03.2021 19:14 centos . Предыдущая версия . Еще …
Отредактировано 02.03.2021 19:36 centos . Предыдущая версия .
vitualfunctions
Re: Вызов виртуальной функции с параметром со знач-м, заданным по-умолчанию?
От: vopl Россия  
Дата: 02.03.21 19:36
Оценка:
Здравствуйте, 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
C>B::f 25
C>B::f 10
C>Объясните, почему вывод 2-й и 3-й строк различается?
C>Последний вопрос: почему в 3-й строчке была вызвана B::f со значением 10?

Тут похожий вопрос http://rsdn.org/forum/cpp/7915458.1
Автор: Marty
Дата: 30.12.20
Re: Вызов виртуальной функции с параметром со знач-м, заданн
От: vopl Россия  
Дата: 02.03.21 19:46
Оценка: 2 (1)
Здравствуйте, 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?
Отредактировано 05.03.2021 16:49 vopl . Предыдущая версия .
Re: Вызов функции с параметром со знач-м, заданным по-умолчанию.
От: watchmaker  
Дата: 02.03.21 20:17
Оценка: +1
Здравствуйте, 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
C>B::f 25
C>B::f 10
C>Почему в 3-й строчке была вызвана B::f со значением 10?

В этом коде B::f со значением 10 не вызывается.

Видно, что в изначальном сообщении до редактирования был другой код, в котором этот вопрос имел какой-то смысл, но теперь его нет
Re: Вызов функции с параметром со знач-м, заданным по-умолчанию.
От: σ  
Дата: 02.03.21 20:41
Оценка:
Платиновых вопросов тред?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.