标题:virtual函数
只看楼主
zhangfuhua
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-7-1
 问题点数:0 回复次数:4 
virtual函数
#include<iostream>

using namespace std;

class A
{
   public:
          virtual void fun1(){cout<<"A fun1"<<endl;}
          virtual void fun2(){cout<<"A fun2"<<endl;}
          void fun3(){cout<<"A fun3"<<endl;}
          void fun4(){cout<<"A fun4"<<endl;}
};

class B:public A
{public:
        virtual void fun1(){cout<<"B fun1"<<endl;}
        virtual void fun2(int x){cout<<"B fun2"<<endl;}
        virtual void fun3(){cout<<"B fun3"<<endl;}
        void fun4(){cout<<"B fun4"<<endl;}
};

      
int main()
{
A* p;
B b;
p=&b;
p->fun1();
p->fun2();
p->fun3();
p->fun4();
  
return 0;
}
搜索更多相关主题的帖子: virtual void cout endl 
2008-02-22 20:24
zhangfuhua
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-7-1
得分:0 
答案是:
  B fun1
    A fun2
    A fun3
    A fun4
为什么?
2008-02-22 20:25
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
得分:0 
使用基类指针访问派生类,虽然派生类成员函数可以覆盖基类成员函数,但是要通过对象覆盖,指针是不可以的,要想实现覆盖,就必须用虚函数,实现动态联编.就可以实现多态了.
收到的鲜花
  • zhangfuhua2008-02-23 09:47 送鲜花  1朵  
2008-02-22 20:49
zhangfuhua
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2006-7-1
得分:0 
谢谢!
2008-02-23 09:50
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
得分:0 
我有一句话,是别人告诉我的,可以方便的理解多态。
    即对于一个类的虚函数而言,子类有的,调用子类的,子类没有的,调用基类的。对于这段代码,A类中有虚函数fun1(),fun2().当继承发生时,B类又覆盖A类的fun1(),fun2(),当对象的指针调用时,即子类有的调用子类的,那么fun1()在子类中有,就调用子类的。
    fun2()子类虽然有,但是参数表改动了,指针调用的的是基类的fun2()的参数表形式,所以可以判断为子类没有,那么调用基类的。
    fun3()在基类中不是虚函数,在子类中的对象又是指针的调用形式,就如同2楼的解释,调用基类的函数。虽然它在子类中是虚函数,然而要想遵守:“子类有的,调用子类的,子类没有的,调用基类的。”的话,为B派生一个子类,在其中覆盖虚函数fun3()就可以了。
    fun4()在子类基类中都不是虚函数,不存在多态的问题,指针调用时调用基类的。
收到的鲜花
  • zhangfuhua2008-03-04 21:27 送鲜花  2朵  
2008-02-25 15:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-200661-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.143832 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved