C++>>Java

C++>>Java

C++博客 首页 新随笔 联系 聚合 管理
  1 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks

        我发现C++中有一个现象就是用指针来调用非虚拟函数时,指针并不一定要指向一个合法的对象的地址。而是随便一个地址都行(当然其静态的类型为某类)。
        比如:(头文件等信息我略去)
             class A
            {
           public:
                   void Output(void)
                 {
                         std::cout<<"A"<<std::endl;
                  }
             };


int main()
{
A *ptr = reinterpret_cast<A*>(0x00000022);//或为A *ptr = NULL;
ptr->Output();

return 0;
}

结果竟然是正确的输出了"A";
我又用了一个方法来测试。就是用指针指向函数局部变量的引用:
class  A
 {
 public:
           void Output(void)
           {
                  std::cout<<"A"<<std::endl;
            }

  /*返回局部变量的引用*/
          static A&  getLocalRef()
         {
                A a;
                return a;
          }
};


int main()
{

A *ptr = &A::getLocalRef();
ptr->Output();

return 0;
}

结果同样是正确的。
我认为这归因于函数的调用方法,因为非虚拟成员函数在内部的表示与一般的函数的表示没有什么不同,仅仅是成员函数有个表示类对象的指针,而普通函数没有。在调用是编译器没有检查到底是不是真的指向一个类对象,仅仅是看类型是不是而已。
到底是什么原因我现在也不清楚,上面的仅仅是我的猜测而已。我希望大家指点指点!

posted on 2006-04-16 12:49 红河谷 阅读(217) 评论(2)  编辑 收藏 引用

Feedback

# re: C++中的函数调用中的一个疑惑 2006-04-17 11:51 ZiDing
你上面的代码要是访问一下本类的成员变量就会crash滴。非虚拟成员函数和普通函数一样,只是多了this指针而已。  回复  更多评论
  

# re: C++中的函数调用中的一个疑惑 2006-04-19 16:06 红河谷
确实这种方法访问成员变量是没有任何意义,但是一旦地址是合法的地址,即使不是该类的对象所在地址,访问也是合法的.但是数据没有意义.  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理