C++对象的内存分布和虚函数表

本文详细解析了C++中类的四种成员:静态数据成员与非静态数据成员、静态函数与非静态函数的区别及作用。重点阐述了这些成员在内存中的布局方式、成员函数与对象之间的绑定关系以及虚函数表的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。

    1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。
    2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。
    3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。
    因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。

#include"iostream.h"

class A
{
private:
 int x;
 int y;
public:
 void sety()
 {
  y=5;
 }
 void print()
 {
  cout<<"x="<<x<<endl<<"y="<<y<<endl;
 }
};

void main()
{
  A a;
  a.sety();
  a.print();
 
int *p=(int *)&a;//对象a的内存模型里面,只有非静态数据成员,所以是合理的。
  *p=6;
  a.print();
}

   4.单继承的对象的内存布局,第一个为函数表(vtable)指针vptr,其后为成员且先基类后子类,虚函数表里包含了所有的虚函数的地址,以NULL结束。虚函数如果子类有重写,就由子类的重新的代替

                                                         

C++对象的内存分布和虚函数表

    <一>上述类图的解释:B的v2覆盖了A的v2,C的v1覆盖了A的v1,C的v3覆盖了B的v3.

    注意:发生覆盖的特征有:

    1) 不同的范围(分别位于派生类与基类);

    2) 函数名字相同

    3) 参数相同

    4) 基类函数必须有virtual关键字。 

   成员函数被重载的特征
  (1)相同的范围(在同一个类中);
  (2)函数名字相同;
  (3)参数不同;
  (4)virtual 关键字可有可无
 隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
  (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
  (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值