首页 > 编程知识 正文

虚函数指针存放在哪里(虚函数与虚函数指针)

时间:2023-05-05 23:15:15 阅读:123942 作者:2946

虚函数的虚函数的作用是什么? 为了主要实现多态机制,在继承层次中基类指针可以有多个不同的指向。 也就是说,如果基类指针指向某个派生类对象,则可以通过基类指针调用派生类的函数,而不是基类的函数。

代码演示class base { virtualvoidprint (void; } class drive 1:公共基{ virtualvoidprint (void ); } class drive 2:公共基{ virtualvoidprint (void ); }Base * ptr1=new Base; base * ptr2=新驱动器1; base * ptr3=新驱动器2; ptr1-print (; //drive1:3360print () prt3-print ),调用//base :3360 print ();//调用//drive2:3360print (。 这是运行时多态性,基类指针只有在运行时才能知道指向的对象是什么。 该运行时多态性通过虚函数表实现。

虚函数指针是指虚函数指针。如果类本身定义了虚函数,或者基类有虚函数,编译器将向该类添加虚函数指针vptr以支持多态机制。 虚函数指针通常位于对象内存布局的第一个位置,对象的地址是虚函数指针的地址。

代码演示classbase{public:base(intI ) :baseI(i ) }; virtualvoidprint(void ) { cout )是第一个虚函数Base:print ) ' endl; }virtual void setI () { cout )是第二个虚函数Base:setI ) ) ' endl; }virtual ~Base () { }private:int baseI; (; int main () baseb ) ) 1000; int*vptradree=(int* ) ) b; 类型语音(* fun ) )语音; cout---------------endl; 计数对象b的地址' b endl; cout '虚函数指针vptr的地址' (int* ) ) b ) endl; cout '虚函数vptr加上解参照*,结果虚函数表的地址' *(int* ) ) b ) endl; cout '虚函数表的地址为int类型' (int* ) ) int* ) ) b ) endl; cout '虚函数表中int类型的地址是FUN函数指针类型' (FUN ) (int ) (int ) ) b ) endl; funvfunc=(fun ) (*(*(int* ) ) int* ) b; vfunc (; cout '虚函数表中第二个虚函数的地址是' (Fun ) ) (*(*(int* ) int* ) ) b )1) endl; vfunc=(fun ) ) ) (*(int* ) ) b )1); vfunc (; ----------------对象b地址010FFA94虚函数指针vptr的地址010FFA94虚函数vptr的结果,虚函数表的地址432948虚函数表的地址为int类型000666 此外,使用FUN函数指针类型00061299调用了第一个虚函数Base:print (虚函数表中第二个虚函数的地址为000611E0,第二个虚函数Base:setI )。 虚函数指针的地址与对象的地址一致,虚函数指针指向的内容由虚函数表的地址(加解参照运算法)得到),将虚函数表的地址转换为int型,之后可以移动到虚函数表中的slot。 在虚函数表的slot中保存了每个虚函数的地址,在向其追加地址时可以指向不同的slot,因此在将对应的地址变换为函数指针的形式后,通过代入函数指针变量,可以调用对应的虚函数

# # # #类型化语音(* fun ) )语音);

代码中包含这样的代码。 这里需要说明。

typedef的使用方法最常见的使用方法int i; typedef int myint; myint j; 使用myint而不是关键字int,稍后使用myint的位置相对于使用int的位置

函数指针方法1 :函数指针的形式为返回类型(*函数名称) (参数表) )

char(*pfun ) ) int; //定义函数指针,该指针指向返回类型为char且参数为int的函数。 pFun是函数指针的方法2。 typedef是一个参数表),函数指针可以使typedef返回类型(*新类型) )更直观。

typedefchar(*ptrfun ) ) int; 定义了以//int为参数返回charPTRFUN pFun的PTRFUN类型。 该类型是指向某些函数的指针。 当使用PTRFUN定义变量pFun时,该变量chargfun(inta ) {return,如方法1所示; (}int main ) ) { pFun=gfun; (*pfun ) ) 2; }所以typedefvoid(*fun ) ) void; 定义了一个Fun类型,返回值为void参数为void的函数,并表示可以使用Fun定义函数指针变量。

编译器在编译时,发现基类中有虚函数。 此时,编译器会为每个包含虚函数的类创建一个虚表。 此表是一个一维数组,用于存储每个虚函数的地址。 因为基类和派生类都有虚函数,所以编译器在两个类中都创建了虚表。

要在派生类调用虚函数时找到正确的函数编译器,请为具有虚函数的类中的每个对象自动创建一个虚表指针vptr,该指针指向对象所属类的虚表。 运行程序时,根据对象的类型初始化vptr,使vptr正确指向其所属类的虚表,所以在调用虚函数时可以找到正确的函数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。