0
假设我有以下层次:简单的继承问题
class A
{
public:
A()
private:
int aa;
}
class B: public A
{
public:
B()
private:
int bb;
}
class D: public B
{
public:
D()
private:
int dd;
}
当我在下面的代码输入我的主:
D dobj;
std::cout<<"Address of D object: "<<&dobj<<std::endl;
A aobj = static_cast<A>(dobj);
A* aptr = static_cast<A*>(&dobj);
std::cout<<"Address of D object: "<<&dobj<<std::endl;
std::cout<<"Address of aptr object: "<<&aptr<<std::endl;
std::cout<<"Address of A object: "<<&aobj<<std::endl;
的输出是:
Address of dobj object: 0012FF0C
Address of dobj object: 0012FF0C
Address of aptr object: 0012FF18
Address of aobj object: 0012FF14
为什么aptr和aobj的地址不同?他们不应该是一样的吗?
而且为什么DOBJ和地址APTR不同?他们不是应该一样吗?
我编译使用VC++的窗口。
感谢, 德Costo。
@de costo:首先,中投是不必要的:你可以隐式'd *'转换为'A *',所以你可以说'APTR = DPTR;'。这些指针可能具有相同的值:'aptr'将指向'D'对象的'A'基类部分。如果'A'基类部分位于'D'对象的开头,那么'aptr'将与'dptr'相同。 – 2011-03-04 23:05:36
我的不好!感谢您指出,但是,如果我将它投射到B的指针,如下所示:B * bptr = static_cast (&dobj);)aptr和bptr的地址相同如果bptr指向D对象的B部分, B基类不在D对象的开始位置,应该不是aptr和bptr是不同的吗? – 2011-03-04 23:11:32
@de costo:'B'类被放在内存中,就像'[A base class] [bb member ]'和'D'类被放在内存中,如'[B base class] [dd member]'。这样,给定'D x;',以下全部三个将给出相同的地址:(1) (2)'static_cast (x)'和(3)'static_cast (x)'。如果您使用Visual C++编译(或在大多数其他编译器上编译),那么在单继承层次结构中你表明,基类应该总是位于派生类的开始处(它最终在继承上下文更便宜itance层次结构)。 – 2011-03-04 23:14:45