dynamic_cast «this» внутри конструктора

Этот вопрос очень похож на этот Почему я не могу использовать dynamic_cast «вбок» во время множественного наследования? , за исключением того, что приведение работает - только не внутри конструктора.

Заголовок:

class A  
{  
public:  
    virtual                ~A() {}
    void                    printA();
};

class B
{
public:
                            B();
    virtual                ~B() {}
    void                    printB();

private:
    std::string             message_;
};

class C : public A, public B
{
public:
                        C() {}
    virtual                ~C() {}
};

Источник:

void A::printA() { cout << "A" << endl; }
B::B()
{
    A* a = dynamic_cast< A* >( this );
    if ( a ) {
        message_ = std::string( "A and B" );
    } else {
        message_ = std::string( "B" );
    }
}
void B::printB() { cout << message_.c_str() << endl; }

Основная:

int main( int argc, char* argv[] )
{
    cout << "Printing C..." << endl;
    C c;
    c.printA();
    c.printB();

    cout << "Checking again..." << endl;
    cout << !!dynamic_cast< A* >( &c ) << endl;

    return EXIT_SUCCESS;
}

Результат:

Printing C...
A
B
Checking again...
1

Итак, dynamic_cast действительно работает для множественного наследования (здесь нет сюрпризов!), Но почему бы и нет, когда он вызывается во время выполнения для 'this 'указатель внутри B :: B ()? Я думал, что объект был полностью сформирован внутри тела конструктора, т.е. вся память была выделена для объектов компонентов, они еще не инициализированы. Я понимаю, что это зависит от порядка конструктора суперкласса, но в этом примере A вызывается перед B.

Я, очевидно, не понимаю, что именно происходит под капотом, может кто-нибудь просветить меня?

Спасибо, Кэм Бамбер.

6
задан Community 23 May 2017 в 11:58
поделиться