凌云窟
南山巅上火麟烈,北海潜深雪饮寒。可怜两锋未缘见,雪刀封隐孤剑鸣。
<2008年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

留言簿(0)

随笔分类

随笔档案

文章档案

相册

简历下载

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-22 文章-0 评论-38 Trackbacks-0
       用代码说话吧。
如下:

class B
{
public:
 
virtual int Comment(int v)
{val = v;cout<<"Base"<<endl;return v;};
protected:
int val;
}
;
class D : public B
{
int Comment (int v)
{val = v;cout<<"Drived"<<endl;return v;};
private:
int val;
}
;
int main(int argc, char* argv[])
{
B
* bptr = new D;
bptr
->Comment(99)  ;  // 标准多态行为
(*bptr).Comment(99);  // 这样也是多态?从结果来看,的确是
system("pause");
return 0;
}


   bptr->Comment(99)这种用->应该是最典型的多态调用的方式,(*bptr).Comment(99)这种首先用*解引用指针然后用.来调用函数既然也能够多态,这大大改变了我以前的认知,甚至我现在还很怀疑这个结论成立否?不过在汇编成面上,他们的代码是一样的,这个证据让我还是很相信这个结论的正确性的。如果我的这份结论是错误的,请大家指出!

posted on 2006-08-02 11:30 莫问春秋 阅读(3925) 评论(6)  编辑 收藏
Comments
  • # re: C++多态居然可以这样用?
    Panic
    Posted @ 2006-08-02 13:28
    (*bptr)这个操作,似乎是未定义的 ,没找到确切证据。
    多态行为可以通过指针和引用两种方式调用,如果(*bptr)被当作引用,结果就是正确的。
  • # re: C++多态居然可以这样用?
    周星星
    Posted @ 2006-08-02 13:52
    应该是正确的,*bptr 的静态类型是 B,动态类型是 D。
    若没有重载的话,p-> 就是 (*p). 。
  • # re: C++多态居然可以这样用?
    非典型秃子
    Posted @ 2006-08-07 13:35
    (*bptr)地返回类型是B&,在引用类型上当然可以实施多态。
  • # re: C++多态居然可以这样用?
    莫问春秋
    Posted @ 2006-08-08 13:31
    什么权威的地方说过 (*bptr)地返回类型是B&??
    能够提供一些出处不?学习下
  • # re: C++多态居然可以这样用?
    Lixeon
    Posted @ 2006-08-15 09:15
    To: 莫问春秋 

    在B和D类里面再加一个Test函数,
    int B::Test() { cout<<"Base"<<endl; }
    int D::Test() { cout<<"Drived"<<endl; }

    注意,Test()是非virtual的。

    再在main里加入 (*pbtr).Test();看看结果,GCC编译后输出结果Base。
    所以(*bptr)地返回类型应该是B&。

    鉴定完毕。
  • # re: C++多态居然可以这样用?
    y
    Posted @ 2006-09-18 01:29
    The expressions
    e–>member     and
    (*e).member                            (where e represents a pointer) 
    yield identical results 
    (except when the operators –> or * are overloaded).
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]