基类,继承类sizeof()
base class, inheritate class sizeof()
为什么在下面的代码中是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;
类Y
的对象有两个整数成员;类CCD_ 5的对象具有一个。你的评论表达了Y
的i
与X
的i
不同的事实,所以看起来你已经知道答案了。
请参阅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个字节。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 在visual c++中从无序映射继承时,模板参数的sizeof()不正确
- 基类,继承类sizeof()
- <sizeof(T)> 作为 C++ 中继承的类模板参数
- 从空类继承时如何解释此 sizeof 结果