Разница в адресе базовых и производных объектов с использованием *, по сравнению с использованием оператора & - PullRequest
0 голосов
/ 28 ноября 2018

Может кто-нибудь попытаться объяснить мне, почему я получаю разницу в адресе базового и производного объекта при использовании этого указателя и оператора &.Ниже мой код

#include <iostream>

using namespace std;

class A
{
    public:
     A()
     {
         cout<<"Base Address "<<this<<endl;
     }
};
class B:public A
{
    public:
    B()
    {
        cout<<"Deri Address "<<this<<endl;
    }
};
int main()
{
    B b;

}

The O/P is 
Base Address 0x7fff500e9bdf
Deri Address 0x7fff500e9bdf

Оба одинаковы.

Когда я добавляю еще два оператора в основной, как показано ниже

#include <iostream>

с использованием пространства имен std;

class A
{
    public:
     A()
     {
         cout<<"Base Address "<<this<<endl;
     }
};
class B:public A
{
    public:
    B()
    {
        cout<<"Deri Address "<<this<<endl;
    }
};
int main()
{
    B b;
    A a;
   cout<<&a<<endl<<&b<<endl;

}

O / P, как показано ниже

Base Address 0x7fff82c696df
Deri Address 0x7fff82c696df
Base Address 0x7fff82c696de
0x7fff82c696de
0x7fff82c696df

Теперь я ясно вижу, что адрес отличается

a) Что может быть причиной такой разницы
б) Еще одна вещь, которую я хотел знать, это то, что базовый субобъект в производном классе точно такой же, как базовый объект?Я запутался в этом, потому что, если мы говорим в базовом классе, есть ли у нас переменная x, и если у нас есть производный класс для этого базового класса (неполиморфный случай), теперь, если мы говорим о базовом подобъекте в производном, является ли онтот же самый x, присутствующий в базовом классе, также присутствует в базовом подобъекте производного класса (я имею в виду переменную с одинаковым адресом в базовом и базовом подобъекте в производном), или у нас есть отдельная копия x как в базовом, так и в базовом подобъектепроизводного (я имею в виду переменную с другим адресом)

Please clarify?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Почему вы получаете то, что видите?ну, это потому, что a != b Вы создаете 2 объекта:

A a;
B b;

Это ясно, если вы добавите еще один параметр в конструктор вашего класса A

class A
{
    public:
     A(std::string name)
     {
         cout<<name<<"'s Base Address "<<this<<endl;
     }
};

и измените вашу main функцию abit

int main()
{
    B b("b");
    A a("a");
   cout<<"a: "<<&a<<endl<<"b: "<<&b<<endl;

}

Теперь ваш вывод будет выглядеть следующим образом

b's Base Address 0x7fff82c696df
b's Deri Address 0x7fff82c696df
a's Base Address 0x7fff82c696de
a: 0x7fff82c696de
b: 0x7fff82c696df

Теперь вы можете видеть, что результаты & operator и *this равны.Вы просто буксируете разные объекты, конечно же, с двумя разными адресами.Вы также видите, что для производного класса B, this имеет то же значение в конструкторе B s и A s.

0 голосов
/ 28 ноября 2018

Я думаю, что первое, что нужно прояснить для вас, это понимание различия между классом против объектом . class - это чертеж, тогда как object - это экземпляр класса.

Итак, если вы не создаете экземпляр класса, то у вас ничего нет в памяти.

В первом случае напечатанные адреса совпадают, потому что вы создали один экземпляр,Имеет смысл иметь один и тот же адрес из-за наличия только одного объекта.

Во втором случае адреса различаются из-за наличия двух разных объектов (создаются два экземпляра класса), а не из-за использования&.Таким образом, следующий код печатает те же адреса.

#include <iostream>

class A
{
public:
    A() { std::cout << "Address with this pointer: " << this << std::endl; }
};

int main()
{
    A a;
    std::cout << "Address with & operator: " << &a << std::endl;
}

Редактировать: Почему представляет один и тот же адрес для подобъекта

Как я уже упоминал в комментариях, яникогда не слышал термин подобъект .Но я получил следующее определение от здесь .

подобъект: Любой объект, который хранится в другом объекте (элементы массива, объекты базового класса и объекты-члены данных).

Объект естественно занимает память, и любой подобъект объекта должен находиться где-то в этой памяти. первый созданный подобъект (с точки зрения порядка определения) получает первую часть памяти, второй созданный подобъект получает вторую часть памяти сразу после первого объектаи так далее.Итак, первый созданный подобъект имеет такой же начальный адрес с самим объектом.В следующем коде созданный первый объект является экземпляром класса A (поэтому A и C имеют одинаковый адрес) только потому, что Class A наследуется раньше, чем Class B .Если вы измените class C : public A, public B на class C : public B, public A, то объекты класса B и класса C будут одинаковыми.

#include <iostream>

class A
{
public:
    A() { std::cout << "Address of Sub-Object A: " << this << std::endl; }
    int x;
};


class B
{
public:
    B() { std::cout << "Address of Sub-Object B: " << this << std::endl; }
    int y;
};

class C : public A,  public B {
public:
    C() : A() , B() { std::cout << "Address of Object C:     " << this << std::endl; }
    int z;

};

int main()
{
  C c;
}

PS: , если вы думаете о композиции, а не о наследовании,тогда это будет легче понять.

0 голосов
/ 28 ноября 2018

У вас есть два объекта: a и b :

a с адресом 0x7fff82c696de

b с адресом 0x7fff82c696df

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...