Простой вопрос наследования - PullRequest
0 голосов
/ 05 марта 2011

Предположим, у меня есть следующая иерархия:

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 разные? Разве они не должны быть такими же?

Я компилирую в Windows, используя VC ++.

Спасибо, Де Косто.

1 Ответ

6 голосов
/ 05 марта 2011

Почему aptr и &aobj отличаются?

Сначала вы печатаете неправильный указатель: &aptr - это «адрес aptr», а не «адрес объекта, на который указывает aptr». Вам нужно просто напечатать aptr, чтобы напечатать «адрес объекта, на который указывает aptr», что, по-видимому, действительно то, что вы действительно хотите сделать.

aptr - указатель на A часть dobj. aobj является копией A части dobj.

aptr и &aobj различаются, потому что это адреса разных объектов.

...