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?
Здравствуйте, 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
Здравствуйте, 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?
Здравствуйте, 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
не вызывается.
Видно, что в изначальном сообщении до редактирования был другой код, в котором этот вопрос имел какой-то смысл, но теперь его нет