Нужно объяснение этого кода с полиморфизмом

Я наткнулся на этот код, и я совершенно не понимаю, как он компилируется, поскольку одна из функций из A ссылается на статическую B. А также то, что она должна делать.

где В происходит от А.

В файле A.h

static A*   instance();

in B.h

static B* instance() { return dynamic_cast<B*>(A::instance()); }

в B.cpp

A* A::instance()
{
    static B s_instance;
    return &s_instance;
}

Определения классов и тому подобное были опущены, чтобы облегчить код.


person DogDog    schedule 22.02.2012    source источник
comment
Я не понимаю проблемы.   -  person Lightness Races in Orbit    schedule 22.02.2012


Ответы (1)


  • A::instance() дает вам A*, который указывает на B. Всегда одно и то же B.
  • B::instance() дает вам результат A::instance(), dynamic_casted to B*.

Нет никаких причин для того, чтобы это вызывало сбой компиляции (за исключением того, что определения A и B отсутствуют).

person Lightness Races in Orbit    schedule 22.02.2012
comment
Есть ли другой способ сделать это? - person DogDog; 22.02.2012
comment
@Apoc: Это полностью зависит от того, для чего код использует эти функции. Какую проблему ты пытаешься решить? - person Lightness Races in Orbit; 22.02.2012
comment
Имея 2 типа синглетонов, один из которых является производным от другого, но имеет только один экземпляр для обоих типов. - person DogDog; 22.02.2012
comment
@Apoc: размещение объекта внутри B::instance() и неявное преобразование указателя A::instance() было бы более аккуратным и не требовало бы, чтобы типы были полиморфными. Было бы даже лучше вообще не использовать синглтон. - person Mike Seymour; 22.02.2012
comment
@Mike Seymour, хорошо, что я не использую синглтон, думаю, я почитаю об этом больше и предложу это команде, если сочту это подходящим. Вот как они боролись с этим типом проблемы в течение довольно долгого времени. - person DogDog; 22.02.2012
comment
@Apoc Какая проблема? Я никогда не видел необходимости в синглтоне. - person Peter Wood; 22.02.2012
comment
В проекте используется для совместного использования сущностей несколькими объектами. Допустим, объекту A, B, C, D нужно использовать несколько виджетов. Мне сказали просто поместить их в менеджер (синглтон), чтобы поделиться ими. - person DogDog; 22.02.2012
comment
Мне сказали, что это не причина. - person Lightness Races in Orbit; 22.02.2012
comment
Для тех, у кого мало опыта и кто не знает лучшей альтернативы, я думаю, что это справедливо. - person DogDog; 23.02.2012