该书The c++ programming language有关于dynamic_cast的部分,我不知道我的理解是否正确。dynamic_casting的对象混淆
dynamic_cast的目的是处理转换的正确性无法由编译器确定的情况。在这种情况下,dynamic_cast(p)查看p指向的对象(如果有的话)。如果该对象属于类T或具有T类型的唯一基类,则dynamic_cast将返回一个类型为T *的指针给该对象;否则,返回nullptr。如果p的值是nullptr,dynamic_cast(p)返回nullptr。请注意,转换必须是唯一标识的对象。可以构造转换失败并返回nullptr的示例,因为p指向的对象具有多个表示类型为T的基类的子对象。
“是否可以构造转换失败的示例,返回nullptr是因为对象指向 to p有多个子对象表示类型T的基类“意思是这样的?
class a {
public:
a() { }
};
class b : public a {
public:
b() { }
};
class z : public a, public b {
public:
z() { }
};
void f(z* p) {
a* x = dynamic_cast<a*>(p); // ambiguous
}
而另外一个,这是从书采取:
class Component : public virtual Storable { /* ... */ };
class Receiver : public Component { /* ... */ };
class Transmitter : public Component { /* ... */ };
class Radio : public Receiver, public Transmitter { /* ... */ };
为指针的无线电对象的模糊性不是一般的检测在编译时。 这种运行时歧义检测仅适用于虚拟基地。对于普通的基础,当向下转换时(即向派生类;§22.2),总是有一个给定演员(或无)的唯一子对象。虚拟基地的等同含糊性发生在上传(即向基地)时,但这种歧义在编译时被捕获。
我完全不明白这一点。这是什么意思“对于普通的基础,总是有一个特定的演员的独特的子对象”?我知道如果基础不是虚拟的,将为每个从它派生的类创建一个子对象。但就演员而言,我刚刚在上面的例子中造成了一个模棱两可的错误。而“上传时发生虚拟基地的等效歧义”,这是什么意思?虚拟基地可能模棱两可吗?任何人都可以解释清楚吗?
除非您使用'virtual'基础,否则给定'a'只有一个孩子'z'。 – Yakk 2015-04-04 14:33:49
@Yakk 你指的是什么? – morbidCode 2015-04-04 14:53:39
你的课a和z以上? – Yakk 2015-04-04 14:57:35