基类,继承类sizeof()

base class, inheritate class sizeof()

本文关键字:sizeof 继承 基类      更新时间:2023-10-16

为什么在下面的代码中是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;

Y的对象有两个整数成员;类CCD_ 5的对象具有一个。你的评论表达了YiXi不同的事实,所以看起来你已经知道答案了。

请参阅http://codepad.org/PZsiyFIk例如类CCD_ 10的对象实际上如何具有两个CCD_。

此处重复代码:

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

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

此外,在类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);

成员函数的概念对我们来说只是一个抽象概念。对象实际上唯一包含的是成员变量,可能还有一个虚拟函数表。

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

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

成员函数不计算大小,除非您有一个虚拟函数,那么对于存储vpointer,它将有4个字节。