базовый класс, наследуйте класс sizeof () - PullRequest
0 голосов
/ 27 марта 2012

Почему в следующем коде sizeof(X) == 4 и sizeof(Y) == 8?

Более того, в классе X почему функции-члены не занимают места в памяти?

class X {
    int i;
public:
    X() { i = 0; }
    void set(int ii) { i = ii; }
    int read() const { return i; }
    int permute() { return i = i * 47; }
};

class Y : public X {
    int i; // Different from X's i
public:
    Y() { i = 0; }
    int change() {
        i = permute(); // Different name call
        return i;
    }
    void set(int ii) {
        i = ii;
        X::set(ii); // Same-name function call
    }
};


    cout << "sizeof(X) = " << sizeof(X) << endl;
    cout << "sizeof(Y) = " << sizeof(Y) << endl;

Ответы [ 4 ]

2 голосов
/ 27 марта 2012

Объекты класса Y имеют два целочисленных члена; объекты класса X имеют его. Ваши комментарии выражают тот факт, что Y i отличается от X * i, поэтому, похоже, вы уже знали ответ.

См. http://codepad.org/PZsiyFIk для примера того, как объект класса Y на самом деле имеет два i члена.

Код повторяется здесь:

#include <iostream>
using namespace std;

class X {
  int i;
public:
  X(): i(4) {}
  int getI() {return i;}
};

class Y: public X {
  int i;
public:
  Y(): i(10) {}
  int getMyI() {return i;}
};

int main() {
  Y y;
  cout << y.getI() << ' ' << y.getMyI() << '\n';
}

Выходы

4 10

В main есть только один объект с именем y. Обратите внимание, что y должно иметь два поля i, чтобы вывод имел смысл.

1 голос
/ 27 марта 2012

Более того, почему в классе X функции-члены не занимают места в памяти?

Думаю, никто еще не рассмотрел эту часть.Функции-члены класса не хранятся внутри самого объекта, потому что они принадлежат классу, а не объекту.Нет смысла хранить копию функции внутри каждого объекта, поскольку код всегда остается неизменным.

sizeof(X) возвращает количество байтов, необходимое для хранения экземпляра типа X, а не всего класса,

Кроме того, функция-член сохраняется в памяти как любая другая обычная функция c.Он просто берет указатель на объект, из которого он вызывается:

int X::permute() { return i = i * 47; }
...
someX.permute();

Превращается в:

int permute(X* _x) { return _x->i = _x->i * 47; }
...
permute(&someX);

Идея функций-членов является для нас лишь абстракцией.Единственное, из чего состоит объект, это переменные-члены и, возможно, таблица виртуальных функций.

1 голос
/ 27 марта 2012

X - базовый класс.Имеет только один элемент данных, т.е. int i.Y является производным от X и имеет свои собственные и производные элементы данных.то есть: два int i с.

0 голосов
/ 27 марта 2012

Размер X равен 4, потому что он имеет int i

Размер Y равен 8, потому что базовый класс i + производный класс i

Функции-члены не принимают размер, если только у вас нетвиртуальная функция, тогда для хранения vpointer у нее будет 4 байта.

...