保障地址baseclass在C++?
-
24-09-2019 - |
题
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型的,这两个地址是相同的...
不隶属于 StackOverflow