注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

C++一些语言特征  

2013-05-26 00:34:01|  分类: 编译器特有相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、通过指针调用确定类虚函数
如果出现这种情况,很可能是设计本身出现了问题。问题的现象就是通过一个指针来调用一个特定基类的虚函数。大致的情形是这样的
      1 struct base
      2 {
      3 virtual void Dump()
      4 {
      5         printf("In Base\n");
      6 }
      7 };
      8 struct derive: public base
      9 {
     10         virtual Dump() {printf("In Derive\n");}
     11 };
     12 int foo(derive * pd)
     13 {
     14         //call base Dump from pd
     15 }
此时通过 (*pd).Dump是不能达到目的的,而直接调用pd->Dump的话,如果pd指向的是一个派生类,则此时调用的是derive的Dump接口。搜索了一下资料,解决的办法是通过
pd->base::Dump()
来完成强制调用基类的Dump函数,这看起来比较简单,但是可能涉及指针地址的转换。这个例子中没有多继承的实现,假设说derive派生自base和另一个基类,那么此时pd可能需要偏移,转换为一个指向特定基类的指针。
二、数组取地址
通常来说,数组可以直接转换为数组类型的元素,例如
int array[10][10]中的array可以自动转换为 int * 类型指针,但是如果对该变量取地址,则其类型转换为更为完整和原始的 int [10][10]类型,在一些希望进行强检测的声明中,可以使用这种类型的引用:
[root@Harry varsize]# g++ arrconv.cpp
arrconv.cpp:2: error: cannot convert ‘int (*)[20]’ to ‘int (*)[10][20]’ in initialization
[root@Harry varsize]# vi arrconv.cpp
[root@Harry varsize]# g++ arrconv.cpp -c
[root@Harry varsize]# cat arrconv.cpp
int array[10][20];
int (*dynvar[])[10][20] = {&array};
[root@Harry vars }
ansi手册对指针转换的说明
An lvalue or rvalue of type “array ofN T” or “array of unknown bound of T” can be converted to an rvalue of type “pointer to T.” The result is a pointer to the first element of the array.
对于数组到指针的默认转换,只是将最高一维转换为指针,其它不变,所以int[10][20]转换为指针时只能转换为 int *[20]
三、gcc对变长数组支持
[root@Harry varsize]# cat varsize.c
int main(int argc, char * argv[])
{
    return sizeof (int[argc]);
}
[root@Harry varsize]# g++ varsize.c
[root@Harry varsize]# ./a.out sdf sdf
[root@Harry varsize]# echo $?
12
说明gcc对变长数组长度计算也是动态计算的,所以分配之后可以使用memset对新分配内容清零。
  评论这张
 
阅读(479)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017