赞
踩
虚函数的作用是为了实现多态,当类中的某个函数希望在派生类中重写时,这个函数要被声明为virtual。具有虚函数的类对象中均会存有虚函数指针,该指针放在对象内存的头部,且指针指向虚函数表,虚函数表中存放虚函数的入口地址,起初,我也不太明白虚函数表的存放位置,看了篇博客《关于C++中虚函数表存放位置的思考 》,其中说虚函数表存放在可执行文件的只读数据字段,感觉有点太深奥了,搞不明白,有兴趣的朋友可以去看看。虚函数表的组织形式是按照基类->派生类的顺序来排序的,如果派生类中有和基类重名的虚函数,就会发生覆盖,具体的分析见《C++ 虚函数表解析》,同时另外一篇同一作者写的对象在内存中的布局,这个应该是上篇文章的升级版,具体阐述了c++对象在内存中的存放形式《C++ 对象的内存布局》
c++中一个类中无非有四种成员:静态数据成员和非静态数据成员,静态函数和非静态函数。
1.非静态数据成员被放在每一个对象体内作为对象专有的数据成员。
2.静态数据成员被提取出来放在程序的静态数据区内,为该类所有对象共享,因此只存在一份。
3.静态和非静态成员函数最终都被提取出来放在程序的代码段中并为该类所有对象共享,因此每一个成员函数也只能存在一份代码实体。在c++中类的成员函数都是保存在静态存储区中的 ,那静态函数也是保存在静态存储区中的,他们都是在类中保存同一个惫份。
因此,构成对象本身的只有数据,任何成员函数都不隶属于任何一个对象,非静态成员函数与对象的关系就是绑定,绑定的中介就是this指针。成员函数为该类所有对象共享,不仅是处于简化语言实现、节省存储的目的,而且是为了使同类对象有一致的行为。同类对象的行为虽然一致,但是操作不同的数据成员。
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。