首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象的dynamic_casting混淆

对象的dynamic_casting混淆
EN

Stack Overflow用户
提问于 2015-04-04 14:17:32
回答 1查看 98关注 0票数 1

c++编程语言”一书中有一些关于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类型基的子对象”?

代码语言:javascript
复制
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
}

另一个,这是从这本书上摘录的:

代码语言:javascript
复制
class Component : public virtual Storable { /* ... */ };
class Receiver : public Component { /* ... */ };
class Transmitter : public Component { /* ... */ };
class Radio : public Receiver, public Transmitter { /* ... */ };

指向Radio对象的指针的歧义在编译时通常无法检测到。这种运行时模糊度检测仅适用于虚拟基地。对于普通的基,在向下转换时(即,面向派生类;§22.2),总是有一个给定的类型的唯一子对象(或没有)。虚拟基的等效歧义发生在向上转换(即面向基)时,但这种歧义在编译时被捕获。

我完全不明白。这意味着“对于普通的基地,总是有一个独特的子对象的一个特定的演员”?我理解如果基不是虚拟的,那么将为每个派生自它的类创建子对象。但就铸造而言,我只是在上面的例子中造成了一个模糊错误。和“虚拟基地的等效歧义发生时,向上”,这是什么意思?虚拟基础可以是模棱两可吗?有人能解释得更清楚吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-04 14:32:41

,对于普通的非虚基,在向下转换(即面向派生类)时,总是有一个给定的强制转换(或无)的唯一子对象;

这是因为非虚拟继承创建了一个严格的派生类层次结构,其中分支不再聚集在一起。对象必须是某些派生类T的对象,位于该类树的叶节点上。在上面,您不能再次遇到T,因为类不能从自身继承。因此,通过动态转换到T,您将得到对象的大多数派生类。对于继承链(或每个继承链)中的任何类,也是类似的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29447459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档