C++为什么sizeof(基类)=sizeof(派生类)

月光散落 发布于 2016/04/02 17:47
阅读 237
收藏 1
#include<iostream>
using namespace std;
class B{
public:
virtual void f(){
cout << "B " << endl;
}
}; 
class D: public B{
public:
void f(){
cout << "D" << endl;
}
};
int main()
{
D d;
B b;

cout <<"B:" << sizeof(b) << "D:" << sizeof(d) << endl;//派生类保留了基类子对象,不是应该

b = d;                                                                                        //不是应该sizeof(基类) < sizeof(派生类)吗?
cout <<"B:" << sizeof(b) << "D:" << sizeof(d) << endl;
return 0;
}
加载中
1
htfy96
htfy96

空基类优化(NBO)

1. 任何类至少要占一个字节

2. 继承空基类不多占用字节

子类只是覆盖了父类的函数(具体表现为覆盖了父类对象的虚表指针),因此没有多占用空间

月光散落
月光散落
回复 @htfy96 : 大概懂了,谢谢啊
htfy96
htfy96
回复 @月光散落 : 简单的来说你可以这么理解:父类和子类头部都包含了一个指向虚表的指针vptr,vptr指向的虚表的头部就储存了f实际的函数地址。调用时都是call (*(obj_ptr+0))[0],实现多态的方法是每一个类都有一个自己的虚表,每一个对象都包含了一个vptr,指向其类的虚表。
月光散落
月光散落
你的意思是:子类的函数表和父类的函数表合在了一起,然后这个子类就只有一个新的指向虚函数表的指针?
1
c
cblock
sizeof只计算成员变量和虚函数表指针的大小。只要这两者相同,sizeof出来的就相同,h
月光散落
月光散落
D 里面包含这一个子基类B,和新定义的成员,那它们为什么还想等?
1
葛世超ChicoGe
葛世超ChicoGe
基类和子类均只有一个vtable指针的大小,另外,还要考虑结构对齐特性,当然在本例里没有体现出来。
月光散落
月光散落
懂了,多谢多谢
返回顶部
顶部