可以安全地假设在非虚拟单继承类层次结构(包含或不包含模板)子类和父类的基类指针是否相同?并且根类的第一个成员也始终位于同一位置(首先表示第二个,但这是我主要考虑的因素)。
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上的代码。
答案 0 :(得分:3)
您的两个类都是“标准布局类”的示例。标准强制要求此类必须与C
样式的内存布局兼容。这意味着,指向类对象的指针始终与指向类的第一个数据成员的指针相同。所以,是的,它是由标准强制执行的。 (我现在正试图找到“标准布局类”的引用。)
编辑 :(取自this question的定义,我手头没有标准,对不起)
标准布局类是一个类:
答案 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;
这意味着基类的成员始终位于派生的开头,并且顺序相同。