简单的继承问题

Vis*_*ddi 0 c++ casting type-conversion

假设我有以下层次结构:

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;  
}
Run Code Online (Sandbox Code Playgroud)

当我在main中键入以下代码时:

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;
Run Code Online (Sandbox Code Playgroud)

其输出是:

Address of dobj object: 0012FF0C
Address of dobj object: 0012FF0C
Address of aptr object: 0012FF18
Address of aobj object: 0012FF14
Run Code Online (Sandbox Code Playgroud)

为什么aptr和aobj的地址不同?他们不应该是一样的??

为什么dobj和aptr的地址不同?他们不应该一样吗?

我正在使用VC++编译Windows.

谢谢,De Costo.

Jam*_*lis 6

为什么aptr&aobj不同?

首先,您打印出错误的指针: &aptr是"地址" aptr,而不是" aptr指向的对象的地址".您需要打印aptr才能打印" aptr点到的对象的地址",这可能是您真正想要做的事情.

aptr是指向A部分的指针dobj. aobj复制的的A一部分dobj.

aptr并且&aobj是不同的,因为它们是不同对象的地址.