C结构的,我保证:

struct Foo { ... };
struct Bar {
  Foo foo;
  ...
}
Bar bar;
assert(&bar == &(bar.foo));

现在,在C++,如果我有:

class Foo { ... };
class Bar: public Foo, public Other crap ... {
  ...
}

Bar bar;
assert(&bar == (Foo*) (&bar)); // is this guaranteed?

如果是这样,你可以给我一个基准(如"C++编程语言,网页xyz")?

谢谢!

有帮助吗?

解决方案

没有保证。从C ++ 03标准(10/3,class.derived):

  

,其中基类子对象在最派生对象(1.8)中分配的次序是不确定的。

其他提示

尽管布基类 不能保证 在你的方式看来已被认为(尽管有更多的保障成员),这是保证:

Bar bar;
assert(&bar == (Foo*) (&bar));

因为铸使用static_cast(每5.4)将转换 &bar 正确,以及之间的比较的指针为基础和指针到来将类似。

然而,这将不会保证:

Bar bar;
void* p1 = &bar;
void* p2 = (Foo*)&bar;
assert(p1 == p2); // not guaranteed

我无法想象它会是这样,我不知道为什么它会需要的人。

我有一个相关的问题。

如果您有菱形继承:

class Base(){ virtual void AFunc(){}  };

class A:Base{};
class B:Base{void AFunc(){} }

class Test:A,B{};


Base * b = (Base*)new Test;

b->AFunc();

让我们假设存储器结构是基地:A:B:测试

请注意,在调用的角度来看,所有的编译器知道是该对象的起始地址,并AFunc期待是相对于B对象的开始,这两个地址将是不一样的!它是如何工作的呢?

一样,如果B为B型的,这两个地址是相同的...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top