ПРИМЕЧАНИЕ: первый ответ верен только для одиночного наследования, множественное наследование ниже (edit2).
для x и y нормально иметь разные адреса, потому что это два разных указателя.Они имеют одно и то же значение, которое является адресом переменной, на которую они указывают.
edit: вы можете использовать это main, чтобы проверить, что я имею в виду, в первой строке будет напечатано значение x
и y
(то есть адрес, на который они указывают), который всегда должен быть одинаковым, потому что на самом деле один и тот же метод будет вызываться из-за виртуальности out
.Второй напечатает свой собственный адрес, который, конечно, отличается, потому что это разные (указатели) переменные.
#include <iostream>
int main()
{
B b;
A* a = &b;
//x and y have different addresses. how and when is this conversion done??
Y* y = b.out();
X* x = a->out();
std::cout << y << std::endl << x << std::endl;
std::cout << &y << std::endl << &x << std::endl;
return 0;
}
edit2: хорошо, это было неправильно, мои извинения.Когда в игру вступает множественное наследование, неявное приведение от Y*
до X*
(то есть при присваивании x, а не при возврате out
) изменит адрес указателя.
Это происходит потому, что при реализации макет Y
содержит 2 дополнительные реализации класса, являющиеся частью, унаследованной от OtherClass
, и частью, унаследованной от X
.При неявном приведении к X*
(что разрешено) адрес должен измениться, чтобы указать на X
-часть Y
, поскольку X не знает OtherClass
.