为什么在下面的代码中,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;发布于 2012-03-27 13:22:58
类Y的对象有两个整数成员;类X的对象有一个整数成员。您的评论表达了Y的i与X的i不同的事实,所以看起来您已经知道了答案。
有关Y类的对象如何实际具有两个i成员的示例,请参见http://codepad.org/PZsiyFIk。
代码重复如下:
#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字段才能使输出有意义。
发布于 2012-03-27 13:27:04
X是基类。只有一个数据成员,即:int i。Y是从X派生的,它有自己的和派生的数据成员。例如:两个int i。
发布于 2012-03-27 17:18:14
此外,在类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);成员函数的概念只是我们可以使用的抽象概念。一个对象实际上只包含成员变量,可能还有一个虚拟函数表。
https://stackoverflow.com/questions/9883742
复制相似问题