Этот вопрос очень похож на этот Почему я не могу использовать 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.
Я, очевидно, не понимаю, что именно происходит под капотом, может кто-нибудь просветить меня?
Спасибо, Кэм Бамбер.