我只是在读 Stroustrup 的新书。在第 22.2.2 章中,他讨论了一个 dynamic_cast 问题。
我自己编写的测试代码如下:
class Storable
{
public:
int i;
virtual void r() {};
Storable()
{
i = 1;
};
};
class Component:public virtual Storable
{
public:
Component()
{
i = 1;
};
};
class Receiver:public Component
{
public:
Receiver()
{
i = 2;
};
};
class Transmitter:public Component
{
public:
Transmitter()
{
i = 3;
};
};
class Radio:public Transmitter
{
public:
Radio()
{
i = 4;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
Radio *r = new Radio();
Storable *s1 = dynamic_cast<Storable*>(r);
Component *c = dynamic_cast<Component*>(s1); // this should be 0 but it is not!
return 0;
}
Stroostrup 解释说 c 应该是一个 nullptr 因为不可能知道哪个版本的 Storable 被引用。但是,我认为它是一个有效的指针。
我猜想 Stroustrup 在这点上可能是正确的,但我看不出我巧妙地错过了什么,其他人能发现吗?