目前最经典的关于虚函数的解释整理
来源:互联网 发布:淘宝有些东西不能评价 编辑:程序博客网 时间:2024/05/18 00:36
自己也曾经被这些东西所困惑过,看见这篇文章写的不错,转载了过来,希望能给同样的迷茫中的人一点线索,仅供参考!(唯一不足之处就是应该把内存示意图贴出来就好多了,有时间我补上)
[1]C++ 对象模型基础
一个类中可以包含静态数据成员、静态成员函数、非静态成员函数和非静态数据成员以及虚函数。其中,前三者(静态数据成员、静态成员函数、非静态成员函数)都并没有被放到对象的布局中,可以从以下两段代码得到验证:
view plaincopy to clipboardprint?
#include
using namespace std;
class Base {
};
int main(){
}
#include
using namespace std;
class Base {
};
int main(){
}
上述的 Base 类是一个空类,占据了一个字节的内存空间,这是为了保证每个类实例化后都拥有独一无二的内存空间。接着我们往 Base 类中添加静态数据成员、静态成员函数和非静态成员函数:
view plaincopy to clipboardprint?
#include
using namespace std;
class Base {
public :
};
int main(){
}
#include
using namespace std;
class Base {
public :
};
int main(){
}
在经过内容填充后, Base 类的实例 a 仍然仅占据 1 个字节的内存空间,与空类无异,这说明了静态数据成员、静态成员函数和非静态成员函数并未被放在对象的内存布局当中 。
接下来往类中添加非静态数据成员:
view plaincopy to clipboardprint?
#include
using namespace std;
class Base {
public :
};
int main(){
}
#include
using namespace std;
class Base {
public :
};
int main(){
}
从上面的代码可以看出:一,非静态数据成员是会被放到对象的内存布局中;二,数据成员是根据声明顺序有序地在内存中进行分布的;三,在没有虚函数的情况下对象所占据的内存大小就是数据成员所占据的空间之和。布局如下图:
a
b
那么如果添加了虚函数以后呢?先看一段代码:
view plaincopy to clipboardprint?
#include
using namespace std;
class Base {
public :
protected :
};
int main(){
}
#include
using namespace std;
class Base {
public :
protected :
};
int main(){