繁体   English   中英

非虚拟单继承类层次结构中的基本指针一致性

[英]Base pointer consistence in a non-virtual single inheritance class hierarchy

是否可以安全地假设在非虚拟的单继承类层次结构(涉及或不涉及模板)中,子类和父类的基类指针相同? 根类的第一个成员也始终位于同一位置(第一个隐含第二个,但这是我主要关注的问题)

struct parent {
    int type_ = 0;
    parent(int type):type_(type) {}
};

struct child: parent {
    child():parent(1) {}
};

child ch;
printf("parent %p\r\n", &static_cast<parent&>(ch).type_);
printf("child %p\r\n", &static_cast<child&>(ch).type_); // :)

从我的C ++-fu,常识和测试来看,它应该是正确的,但是我正在寻找符合C ++标准的答案以使我感到舒适。 :)

PS请参阅ideone.com上的代码。

您的两个类都是“ standard-layout class”的示例。 标准规定,此类必须与C风格的内存布局兼容。 这意味着,指向类对象的指针始终与指向类的第一个数据成员的指针相同。 因此,是的,它是标准要求的。 (我现在正在尝试查找对“ standard-layout类”的引用)。

编辑 :( 此问题的定义,我手边没有标准,抱歉)

标准布局类是这样的类:

  • 没有非标准布局类(或此类数组)或引用的非静态数据成员,没有虚函数(10.3)和虚基类(10.1),
  • 对所有非静态数据成员具有相同的访问控制(条款11),
  • 没有非标准布局的基类,
  • 在最派生的类中没有非静态数据成员,在一个非静态数据成员中最多没有一个基类,或者没有具有非静态数据成员的基类,并且
  • 没有与第一个非静态数据成员相同类型的基类。

您始终可以将派生类转换为基类。

class Base{
public:
  int n;
};

class Derived: public base{

};


//you can do this:
Derived obj;
Base *p = &obj;//just take the derived address and put in base pointer, without cast.
cout<<p->n;

这意味着基础成员始终位于派生对象的开头,并且顺序相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM