2011-03-04 75 views
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。

回答

6

为什么aptr&aobj不同?

首先,要打印出了错误的指针:&aptr是“的aptr地址”,而不是“对象到aptr点的地址。”您只需要打印aptr以打印“aptr要点的对象的地址”,这可能是您真正想要执行的操作。

aptr是指向dobjA部分的指针。 aobjdobjA部分的副本

aptr&aobj因为它们是不同对象的地址不同。

+0

@de costo:首先,中投是不必要的:你可以隐式'd *'转换为'A *',所以你可以说'APTR = DPTR;'。这些指针可能具有相同的值:'aptr'将指向'D'对象的'A'基类部分。如果'A'基类部分位于'D'对象的开头,那么'aptr'将与'dptr'相同。 – 2011-03-04 23:05:36

+0

我的不好!感谢您指出,但是,如果我将它投射到B的指针,如下所示:B * bptr = static_cast (&dobj);)aptr和bptr的地址相同如果bptr指向D对象的B部分, B基类不在D对象的开始位置,应该不是aptr和bptr是不同的吗? – 2011-03-04 23:11:32

+0

@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