Ковариантные возвращаемые типы с множественным наследованием. как работает этот код?

Кто-нибудь может сказать мне, как ковариация возвращаемого типа работает в следующем коде?

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. Когда же тогда выполняется приведение?

10
задан Leo 28 July 2011 в 10:04
поделиться