关于虚函数的两个例子

        晚上看了半天的COM,而里面又是满篇的虚函数。尽管自己对于虚函数有一定的了解,但是远离C++也有一些时日,看来补补课是很有必要的了。
        打开自己收藏夹,目光停留在周星星老大经常出没的地方:vcKBase。于是,从这个宝库中找到了自己需要的两篇文章: C++中的虚函数(一)C++实践系列>C++中的虚函数(virtual function)
        两篇文章都写得不错,尤其是第二篇,写得很有分量,让人收益非浅。而第一篇通过列举的方式将虚函数的特点一一道来也很不错,美中不足的就是作为范例的代码有些瑕疵了。现列举如下:
        1、文章中的第五点通过以下代码以说明多态性:
ExpandedBlockStart.gifContractedBlock.gifclass A dot.gif {
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual void f() dot.gif{ cout << "A::f" << endl; }
ExpandedBlockEnd.gif}
;
ExpandedBlockStart.gifContractedBlock.gif
class B :public Adot.gif {
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual void f() dot.gif{ cout << "B::f" << endl;}
ExpandedBlockEnd.gif}
;
ExpandedBlockStart.gifContractedBlock.gif
class C :public A dot.gif {
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual void f() dot.gif{ cout << "C::f" << endl;}
ExpandedBlockEnd.gif}
;
ExpandedBlockStart.gifContractedBlock.gif
class Drive : public C dot.gif {
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual void f() dot.gif{ cout << "D::f" << endl;}
ExpandedBlockEnd.gif}
;
None.gif
None.gif
int main(int argc, char*  argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    A a;
InBlock.gif    B b;
InBlock.gif    C c;
InBlock.gif    Drive d;
InBlock.gif    a.f();
InBlock.gif    b.f();
InBlock.gif    c.f();
InBlock.gif    d.f();
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif

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

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

ExpandedSubBlockStart.gifContractedSubBlock.gif    
void show() dot.gif{
InBlock.gif        fun();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
class B : public A dot.gif {
InBlock.gif
public:
ExpandedSubBlockStart.gifContractedSubBlock.gif    
virtual void fun() dot.gif{
InBlock.gif        cout 
<< "B::fun" << endl;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
int main() dot.gif {
InBlock.gif    A a;
InBlock.gif    a.show();
InBlock.gif    
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}
      

            作者仍然犯了跟上面相同的错误,只有将main()函数中的代码改为下面的形式才能达到预期的结果。
ExpandedBlockStart.gifContractedBlock.gifint main() dot.gif {
InBlock.gif    A 
*= new B;
InBlock.gif    a
-> show();
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值