基类,继承类sizeof()

时间:2012-03-27 05:19:54

标签: c++ class sizeof

在以下代码中,为什么sizeof(X) == 4sizeof(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 个答案:

答案 0 :(得分:2)

Y的对象有两个整数成员;类X的对象有一个。您的评论表明Y的{​​{1}}与i的{​​{1}}不同,所以看起来您已经知道了答案。

有关类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字段才能使输出有意义。

答案 1 :(得分:1)

X是基类。只有一个数据成员,即:int i。 Y是从X派生而来的,有自己的和派生的数据成员。即:两个int i s。

答案 2 :(得分: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);

成员函数的概念只是我们使用的抽象。对象实际上唯一包含的是成员变量,也可能是虚函数表。

答案 3 :(得分:0)

X的大小为4,因为它有一个int i

由于基类i +派生类i ,Y的大小为8

成员函数不占用大小,除非你有一个虚函数然后存储vpointer它将有4个字节。