2012-03-27 3 views
0

Почему в следующем коде sizeof(X) == 4 и sizeof(Y) == 8?базовый класс, наследуемый класс sizeof()

Кроме того, в классе 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; 

ответ

2

Объекты класса Y имеют два члена целочисленные; объекты класса X есть. Ваши комментарии выражают тот факт, что - 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 для вывода, чтобы иметь смысл.

+0

Я копирую из кода книги. :)Теперь я знаю. но не очень ясно, как использовать эти два diff i. – user1279988

+0

Добавлен в мой ответ. Надеюсь, поможет. –

+0

Я видел код в кодексе. спасибо за ур ответ! – user1279988

0

Размер X является 4, поскольку он имеет Int я

Размер Y является 8 из базового класса I + производный класс я

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

+0

Я знаю, спасибо u за ур ответ. Он имеет два значения i – user1279988

1

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

1

Кроме того, в классе 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); 

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

Смежные вопросы