我只是在读 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 在这方面可能是正确的,但我看不出我错过了什么,其他人能发现吗?
最佳答案
我看不出那里有歧义。您是否正确转录了示例?引用 C++11,[expr.dynamic.cast]
§8(使用 dynamic_cast<C*>(v)
):
您的 v
是 s1
,它指向 Storable
类型的最派生对象的 Radio
子对象。在 Component
中只有一个 Radio
类型的基类子对象,并且它是公共(public)的,因此动态转换应该成功,就像它一样。
如果 Radio
也是从 Receiver
派生的,那将是模棱两可的;也许你错过了?
关于c++ - Dynamic_cast 与不明确的目标类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19090880/