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

时间:2014-03-06 21:15:19

标签: c++ inheritance c++11

可以安全地假设在非虚拟单继承类层次结构(包含或不包含模板)子类和父类的基类指针是否相同?并且根类的第一个成员也始终位于同一位置(首先表示第二个,但这是我主要考虑的因素)

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上的代码。

2 个答案:

答案 0 :(得分:3)

您的两个类都是“标准布局类”的示例。标准强制要求此类必须与C样式的内存布局兼容。这意味着,指向类对象的指针始终与指向类的第一个数据成员的指针相同。所以,是的,它是由标准强制执行的。 (我现在正试图找到“标准布局类”的引用。)

编辑 :(取自this question的定义,我手头没有标准,对不起)

标准布局类是一个类:

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

答案 1 :(得分:0)

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

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;

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