更新时间:2018-12-19 15:34:05浏览次数:1+次
类和对象的内存分配机制:
例:
class CMem
{
public:
CMem();
public:
int m_first;
private:
unsigned char m_second;
public:
fun1();
};
则对象:
CMem a,b;
其内存的分配方式:
虚函数在对象的内存中会创建一个虚表
我们可以看到虚函数的工作机制,由于对象的内存空间中包含了虚表入口,编译器能够由这个入口找到恰当的虚函数。
实例:
class CMem
{
public:
CMem(){};
public:
int m_first;
private:
unsigned char m_second;
public:
fun1();
virtual int funover()
{
return 1;
}
class CMemSub :public CMem
{
public:
CMemSub(){};
public:
int m_three;
private:
int m_four;
public:
fun3();
virtual int funOver()
{
return 2;
}
virtual int fun4()
{
return 3;
}
};
则对象:
CMem a;
CMemSub b;
的内存分类就是如上图所示。
我们加个程序段:
{
CMem a,*pMem;
CMemSub b;
pMem=&a;
printf("%d\n",pMem->funOver());
pMem=&b;
printf("%d\n"pMem->funOver());
}
指针调用成员函数与调用对象的类型无关,只和指针的类型相关。
如果没有virtual关键字的话,那也就没有虚表内存,这个程序段输出结果都是一样的,指向基类的内存调用,而今有了虚表,这个函数的地址不再有数据类型决定了。
如果你懂上面的意思了,那么下面的这段话你也能理解。
如果类包含虚拟成员函数,则将此类的析构函数也定义为虚函数。这是很有必要的,因为派生类对象往往由基类的指针引用,如果使用new操作符在堆中构造派生类对象,并将其地址付给基类指针,那么最后要使用delete操作符删除这个基类指针。如果析构函数不是虚函数,派生类的析构函数不会被调用,调用的是指针所指向的类型。
相关资讯