首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基类,继承类sizeof()

基类,继承类sizeof()
EN

Stack Overflow用户
提问于 2012-03-27 13:19:54
回答 4查看 127关注 0票数 0

为什么在下面的代码中,sizeof(X) == 4sizeof(Y) == 8

此外,在类X中,为什么成员函数不占用任何内存空间?

代码语言:javascript
复制
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;
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-27 13:22:58

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

有关Y类的对象如何实际具有两个i成员的示例,请参见http://codepad.org/PZsiyFIk

代码重复如下:

代码语言:javascript
复制
#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';
}

输出

代码语言:javascript
复制
4 10

main中只有一个名为y的对象。请注意,y必须有两个i字段才能使输出有意义。

票数 2
EN

Stack Overflow用户

发布于 2012-03-27 13:27:04

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-27 17:18:14

此外,在类X中,为什么成员函数不占用任何内存空间?

我认为还没有人涉及到这一部分。类的成员函数不会存储在对象本身中,因为它们属于类,而不是对象。没有理由在每个对象中存储函数的副本,因为代码总是保持不变。

sizeof(X)返回存储X类型的实例所需的字节数,而不是整个类。

此外,成员函数像任何其他普通的c函数一样存储在内存中。它只需要一个指向调用它的对象的指针:

代码语言:javascript
复制
int X::permute() { return i = i * 47; }
...
someX.permute();

变成:

代码语言:javascript
复制
int permute(X* _x) { return _x->i = _x->i * 47; }
...
permute(&someX);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9883742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档