这个问题和这个问题非常相似Why can't I dynamic_cast "sideways" during multiple继承?,除了演员表确实有效 - 只是不在构造函数内部。
标题:
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 之前被调用。
我显然不明白幕后到底发生了什么,有人可以赐教吗?
谢谢,凸轮班伯。