我只是在读 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) ):



您的 vs1 ,它指向 Storable 类型的最派生对象的 Radio 子对象。在 Component 中只有一个 Radio 类型的基类子对象,并且它是公共(public)的,因此动态转换应该成功,就像它一样。

如果 Radio 也是从 Receiver 派生的,那将是模棱两可的;也许你错过了?

关于c++ - Dynamic_cast 与不明确的目标类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19090880/

10-12 20:44