この質問はこれと非常によく似ています。複数の継承中に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は多重継承に対して機能しますが(驚くことではありません!)、実行時にB :: B()内の'this'ポインターに対して呼び出された場合はどうでしょうか。オブジェクトはコンストラクターの本体内で完全に形成されたと思いました。つまり、すべてのメモリがコンポーネントオブジェクトに割り当てられましたが、まだ初期化されていません。これはスーパークラスのコンストラクターの順序に依存することを理解していますが、この例では、AはBの前に呼び出されます。
私は明らかに内部で何が起こっているのか正確には理解していません、誰かが私を教えてくれますか?
ありがとう、カムバンバー。