首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指针-派生类对象和基类对象的可转换性及其标准的措辞

指针-派生类对象和基类对象的可转换性及其标准的措辞
EN

Stack Overflow用户
提问于 2020-10-07 09:59:54
回答 1查看 90关注 0票数 0

我试图理解什么时候可以通过指向空的指针安全地将派生对象转换到基子对象(我认为它应该与reinterpret_cast相同)。但“标准”在这方面的措辞,我能找到,让我感到困惑。首先,

如果以下情况下,

两个对象a和b是指针可互换的:

-一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则为该对象的第一个基类子对象。

因此,无论“或”是否适用于“或”之前的整个分句,或仅适用于第二部分,都不能得出可靠的结论。这一点很重要,因为我无法确定在没有非静态数据成员的情况下,“标准布局类对象”是否是指针-子对象与基子对象的可转换性的必要条件。

但是,在深入研究标准的同时,我发现:

如果标准布局类对象有任何非静态数据成员,则其地址与其第一个非静态数据成员的地址相同。否则,它的地址与它的第一个基类子对象的地址相同(如果有的话)。

这似乎更清楚的是,“标准布局”是必需的。但还是很困惑。考虑以下代码:

代码语言:javascript
复制
class B { public: int b; };
class C : public B { public: int c; };

int main ()
{ 
    C c;
    B* b = &c;
    std::cout << &c << " address of standard-layout class object\n";
    std::cout << &c.c << " address of its first non-static data member\n";
    std::cout << b << " address of first base class subobject\n";
    return 0;
}

在VS2019上,结果是:

代码语言:javascript
复制
009BFBF8 address of standard-layout class object
009BFBFC address of its first non-static data member
009BFBF8 address of first base class subobject

标准不是这么说的。你能解释一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-07 10:26:00

重点在于标准布局类的定义。来自http://www.cplusplus.com/reference/type_traits/is_standard_layout/

标准布局类是一个类(用类、结构或联合定义):

  • 没有虚拟函数,也没有虚拟基类。

  • 对其所有非静态数据成员具有相同的访问控制(私有、保护、公共)。

  • 或者在大多数派生类中没有非静态数据成员,最多有一个具有非静态数据成员的基类,或者没有具有非静态数据成员的基类。

  • 的基类(如果有的话)本身也是一个标准布局类.

  • 并没有与其第一个非静态数据成员具有相同类型的基类.

在您的示例中,类C与第三条规则不匹配,因此不是标准布局类

另外,关于“或”的问题,它只适用于第二部分,即“或”之后的语句仍然是关于标准布局类对象的,但没有非静态成员。

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

https://stackoverflow.com/questions/64241683

复制
相关文章

相似问题

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