Я как раз читал новую книгу Страуструпа. В главе 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;
}
Строструп объясняет, что c должен быть nullptr, поскольку невозможно узнать, о какой версии Storable идет речь. Тем не менее, я получаю это как действительный указатель.
Я предполагаю, что Страуструп, вероятно, прав в этом, но я не вижу, что тонко я упустил, может ли кто-нибудь еще это заметить?