注册 登录
编程论坛 C++教室

virtual函数

zhangfuhua 发布于 2008-02-22 20:24, 970 次点击
#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;
}
4 回复
#2
zhangfuhua2008-02-22 20:25
答案是:
  B fun1
    A fun2
    A fun3
    A fun4
为什么?
#3
sunkaidong2008-02-22 20:49
使用基类指针访问派生类,虽然派生类成员函数可以覆盖基类成员函数,但是要通过对象覆盖,指针是不可以的,要想实现覆盖,就必须用虚函数,实现动态联编.就可以实现多态了.
#4
zhangfuhua2008-02-23 09:50
谢谢!
#5
VanHorn2008-02-25 15:56
我有一句话,是别人告诉我的,可以方便的理解多态。
    即对于一个类的虚函数而言,子类有的,调用子类的,子类没有的,调用基类的。对于这段代码,A类中有虚函数fun1(),fun2().当继承发生时,B类又覆盖A类的fun1(),fun2(),当对象的指针调用时,即子类有的调用子类的,那么fun1()在子类中有,就调用子类的。
    fun2()子类虽然有,但是参数表改动了,指针调用的的是基类的fun2()的参数表形式,所以可以判断为子类没有,那么调用基类的。
    fun3()在基类中不是虚函数,在子类中的对象又是指针的调用形式,就如同2楼的解释,调用基类的函数。虽然它在子类中是虚函数,然而要想遵守:“子类有的,调用子类的,子类没有的,调用基类的。”的话,为B派生一个子类,在其中覆盖虚函数fun3()就可以了。
    fun4()在子类基类中都不是虚函数,不存在多态的问题,指针调用时调用基类的。
1