posts - 256, comments - 1319, trackbacks - 41, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

关于虚函数的两个例子

Posted on 2004-09-07 23:57 FantasySoft 阅读(670) 评论(3)  编辑 收藏 所属分类: All About SoftPure C++
        晚上看了半天的COM,而里面又是满篇的虚函数。尽管自己对于虚函数有一定的了解,但是远离C++也有一些时日,看来补补课是很有必要的了。
        打开自己收藏夹,目光停留在周星星老大经常出没的地方:vcKBase。于是,从这个宝库中找到了自己需要的两篇文章:
C++中的虚函数(一)C++实践系列>C++中的虚函数(virtual function)
        两篇文章都写得不错,尤其是第二篇,写得很有分量,让人收益非浅。而第一篇通过列举的方式将虚函数的特点一一道来也很不错,美中不足的就是作为范例的代码有些瑕疵了。现列举如下:
        1、文章中的第五点通过以下代码以说明多态性:
class A {
public
:
    
virtual void f() { cout << "A::f" << endl; }

}
;
class B :public A
{
public
:
    
virtual void f() { cout << "B::f" << endl;}

}
;
class C :public A 
{
public
:
    
virtual void f() { cout << "C::f" << endl;}

}
;
class Drive : public C 
{
public
:
    
virtual void f() { cout << "D::f" << endl;}

}
;

int main(int argc, char*
 argv[])
{
    A a;
    B b;
    C c;
    Drive d;
    a.f();
    b.f();
    c.f();
    d.f();
    
return 0
;
}


        事实上,这样的代码是不能说明问题的。因为虚函数需要通过指针或者引用才能实现多态的效果。在第一篇文章中,作者就是通过跟以上类似的代码来说明,使用了虚函数并不等于实现了多态

        2、文章中第七点通过以下代码来说明通过虚函数可以实现基类调用继承类方法:
class A {
public
:
    
virtual void fun() 
{
        cout 
<< "A::fun" <<
 endl;
    }

    
void show() {
        fun();
    }

}
;

class B : public A 
{
public
:
    
virtual void fun() 
{
        cout 
<< "B::fun" <<
 endl;
    }

}
;

int main() 
{
    A a;
    a.show();
    
    
return 0
;
}
      

            作者仍然犯了跟上面相同的错误,只有将main()函数中的代码改为下面的形式才能达到预期的结果。
int main() {
    A 
*= new
 B;
    a
->
 show();
    
return 0
;
}
      

Feedback

#1楼    回复  引用    

2004-09-08 20:03 by mike [未注册用户]
"因为虚函数需要通过指针或者引用才能实现多态的效果。"

Are you sure, buddy?

#2楼    回复  引用  查看    

2004-09-08 21:26 by Fantasysoft      
To mike:I'm sure, buddy!
因为多态性的含义是:This ability to manipulate more than one derived type with a base class pointer or reference is called polymorphism。

#3楼    回复  引用    

2005-12-10 22:32 by 暮鼓晨钟 [未注册用户]
It might cause memory leak if the base class was defined without virtual destruct function, just like the sample in the last code fragment.

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-10-14 17:29 编辑过
 
另存  打印