我的问题是这样的,现在有个类
class A
{
    virtual func1(){}
    func2(){}
}
请问:
如果类B继承了类A,在类B中改写了函数func1()和func2()有什么区别呢?
也就是加虚拟函数和不加虚拟函数有什么区别呢?

解决方案 »

  1.   

    A a;
    B b;A * p1 = (A*)&b ;
    p1->fun1();调用的是B类的fun1
      

  2.   

    技术上可行
    符合你的要求吗?
    如果不明白,你可以
    (1),给我发短消息(请附帖子的地址).
    (2),根据http://www.vcshare.net上的联系方式与我联系,业余时间推荐QQ,工作时间推荐发到我论坛.
    (3),如果问题简单,请在http://www.vcshare.net/bbs/default.asp上发帖.
        如果问题比较复杂,请把代码压成*.rar当附件发在我的论坛上发帖.
        同时在www.csdn.net上发帖,并给出在我的论坛的链接.
    ---------------
    压代码前,请先删除debug,release文件夹,及*.opt,*.ncb,*.plg,*.aps.
    如果程序比较大
    (1),请写好注释,否则会很头痛.
    (2),注明那些类是自己写的,那些是下载的.
    用户名:guest ,guest1,guest2,guest3,guest4
    密码都是: 123
      

  3.   

    加虚拟函数和不加虚拟函数有什么区别呢?
    加虚拟函数可以实现动态调用,
    如上面兄台
    根据类来调用函数
    不加虚拟函数
    没有动态,
    如:
    A * p1 = (A*)&b ;
    p1->fun2();调用的是A类的fun2
      

  4.   

    虚拟函数 是 为了实现多态性。所谓的多态 简单说就是在通过基类指针调用虚函数时,会自动判断该指针指向的对象本质上是基类对象还是派生类对象,然后调用正确的虚函数。比如
    class A  //基类
    {
      virtual func1(){}
      func2(){}
    };class B //继承类
    {
      /*virtual 这个可以不要,虚函数在派生类中自动为虚函数*/ 
      func1(){.....}
      func2(){.....}
    }A a;
    B b;A * p1 = (A*)&b ;
    p1->fun1();//调用的是B类的fun1
    p1 = &a;
    p1->fun1();//调用A类的fun1
      

  5.   

    而你通过p1调fun2则两次调用的都是类A的fun2
    因为fun2不是virtual的,不能实现多态。
      

  6.   

    <深入浅出mfc> 有一个虚拟函数的例子讲得易懂,你可以看一下