或者有人会问:构造函数呢?还有虚函数本身不是还有函数体吗?难道不用计算进去?确实,类的函数是不会存储在实例化出来的对象里的,试想,对于每个对象,函数实现都是一样的,如果每实例化一个对象就存储一次函数体,不是毫无必要并且对内存使用而言是极大的浪费?
函数编译出来后是作为代码的一部分放在代码段中的,因此只要我们定义了Derived指针,无论这个实际指针指向什么对象,由于程序“事先”已经知道了这个方法属于哪个类,只要指针的类型正确,都可以正确找到调用函数的入口。所以即使我们的代码这么写,也是可以正确运行的:
void * p2 = (int*)0;
Derived* p3= (Derived*)p2;
cout << p3->m_funcD() << endl;
不管把什么地址赋给p2,都能正确地执行m_funcD函数。当然如果p3定义成其他类型,那么编译就会出错。
如果执行以下代码:
void * p2 = (int*)0;
Derived* p3= (Derived*)p2;
cout << p3->m_d << endl;
那么程序就会出现错误了,因为和成员函数不同,成员变量是每个对象都会在内存中用实际的内存地址存储,所以说成员函数属于类,成员变量属于各自的对象。
以上就是小编为大家带来的由static_cast和dynamic_cast到C++对象占用内存的全面分析全部内容了,希望大家多多支持ASPKU~
注:相关教程知识阅读请移步到C++教程频道。










