本书The c++ programming language包含有关dynamic_cast的部分,我不确定我是否理解正确。
dynamic_cast的目的是处理编译器无法确定转换正确性的情况。在这种情况下,dynamic_cast(p)查看p指向的对象(如果有)。如果该对象是T类或具有类型T的唯一基类,则dynamic_cast将返回类型为T *的指针给该对象;否则,返回nullptr。如果p的值为nullptr,则dynamic_cast(p)返回nullptr。请注意转换必须是唯一标识的对象的要求。可以构造转换失败并返回nullptr的示例,因为p指向的对象具有多个表示类型T的基础的子对象。
是否“可以构造转换失败的示例,并且因为对象指向而返回nullptr 通过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 { /* ... */ };
指向Radio对象的指针的模糊性通常在编译时是不可检测的。 仅对虚拟基础需要这种运行时模糊度检测。对于普通基数,在向下转换时(或者,对于派生类;§22.2),始终存在给定转换(或无)的唯一子对象。当向上转换(即向基础)时,虚拟基础的等效模糊性发生,但是这种模糊性在编译时被捕获。
我完全不理解这一点。这是什么意思“对于普通基地,总会有一个特定演员的独特子对象”?我理解如果基础不是虚拟的,将为从它派生的每个类创建一个子对象。但就投射而言,我只是在上面的例子中引起了歧义错误。并且“在向上转换时会出现虚拟基础的等效模糊”,这意味着什么?虚拟基地可以模棱两可吗?任何人都可以解释清楚吗?
答案 0 :(得分:1)
“对于普通的[非虚拟]基础,在向下转换时(或朝向派生类;§22.2
这是因为非虚拟继承会创建派生类的严格层次结构,其中分支不会再次聚集在一起。对象必须是某个派生类最多的T
,在该类树的叶节点处。上去,你不能再遇到T
,因为一个类不能从它自己继承。因此,通过动态转换为T
,您将最终得到对象的派生类最多。对于(或每个)继承链中的任何类也是如此。