Кто-нибудь может сказать мне, как ковариация возвращаемого типа работает в следующем коде?
class X
{
public:
int x;
};
class Y: public OtherClass, public X
{
};
static Y inst;
class A {
public:
virtual X* out() = 0;
};
class B : public A
{
public:
virtual Y* out()
{
return &inst;
}
};
void 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();
}
РЕДАКТИРОВАТЬ: Извините, я, должно быть, недостаточно ясно выразился. x и y указывают на разные адреса, как я и ожидал, поскольку задействовано множественное наследование, поэтому объекты X и Y не находятся на одном адресе. У меня вопрос: когда будет сниматься этот слепок? функция out () не могла этого сделать, потому что она всегда возвращает указатель на Y со своей точки зрения. Вызывающий out () не мог этого сделать, потому что он видит X *, конкретный тип которого может быть X или Y. Когда же тогда выполняется приведение?