В последней строке myA = foo(myOtherB);
функция вернет тип объекта типа B
Не верно.Ваша функция возвращает объект типа A
по значению.Это означает, что любое значение, которое вы передаете этому объекту, будет использовано для создания нового объекта этого точного типа.Другими словами:
int foo(float a) {
return a + 0.5;
}
int u;
u = foo(9.3);
// u has a value of 10
Не ожидайте, что u
будет содержать значение, которое int не может.
То же самое, если вы используете пользовательские типы:
A foo(A& input) {
input.foo();
return input; // this expression returns a new A
// using the value of `input`
}
A myA;
myA = foo(myOtherB);
// why would `myA` be anything else than the value of an A?
Итак, что же здесь происходит?
B foo()
A copy ctor //what calls this?
A op=
A foo(A& input) {
input.foo(); // prints B foo, virtual call. a reference to A that
// points to an object of subclass type B
return input; // copy `input` into the return value object
}
Затем вызывается оператор =.