当前位置:C++技术网 > 资讯 > 类,对象,虚函数内存分配小解

类,对象,虚函数内存分配小解

更新时间: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操作符删除这个基类指针。如果析构函数不是虚函数,派生类的析构函数不会被调用,调用的是指针所指向的类型。