现在的位置: 首页 > 综合 > 正文

C++复位义成员的访问

2012年09月28日 ⁄ 综合 ⁄ 共 821字 ⁄ 字号 评论关闭

      C++的继承特性在一般的小型程序中很不常用,但是对于比较大型的项目,是屡见不鲜。多数初学,或者不常使用C++继承特性的人都会认为派生类中的成员不可以和基类中的成员重名(虚函数除外),其实不然,这种情况不仅是允许的,而且还比较常见。
     

假设有两个类,一个List类,一个String类,List类中有insert()函数和x变量,且insert()函数不是虚函数,String继承
于List,并也有insert()函数和x变量,这时我们通过String对象调用insert()函数或者访问x变量会直接调用
String::insert()或者访问String::x。那我们该如何访问基类中的成员呢?大部分C++入门书籍中都没有关于这个问题的解释,要想
解释这个问题,我们要先来看一下C++类对象的内存结构。

图片来自网络,注:__vfptr为虚函数指针

从该图便可看出派生类的内存结构,在派生类的成员前面,会有一块内存存放基类中的成员,我们需要调用的List::insert()和List::x便存储在这里。

String类结构:

List::insert

List::x

String::insert

String::x

 

如此一来,想要访问基类中的重名成员就简单多了。由于基类中的成员是在对象的头部,我们便可以使用强制类型转换的方法,按照基类的格式访问成员(对此,看过PEViewer源代码的同学一定不陌生,PEViewer就是对存放文件内容的内存进行转换后读取属性的)。

具体代码:

String str;

((List*)(&str))->insert();                       //访问List::insert()

(*(List*)(&str)).insert();

((List*)(&str))->x;                               //访问List::x

(*(List*)(&str).x;

 

抱歉!评论已关闭.