/*虚函数*/

/***********************************************************************
虚函数建立在继承情况下的
虚函数:一个成员函数(不包括构造函数和静态成员函数)前面有virtual关键字
虚函数好处: 可以用一致的(相同的)方法,在不同种情况,完成不一样的实现
用同样的接口,完成不同的实现
虚函数写法:
  1.
在基类和派生类中,有同名的函数,参数一样,返回值一样。那么在基类中
   
此函数前加上virtual关键字,派生类(virtual)可加可不加
  2.
调用,必须使用基类的指针或则引用完成调用
如何判断函数去哪里?
  pb->Fun();
 
基类的指针调用函数FUN
    1
如果FUN是非虚成员函数,那么执行 基类::FUN()
    2
如果FUN是虚函数
      a.
如果基类指针指向的是基类对象,执行基类::FUN()
      b.
如果基类指针指向的是派生类对象,执行派生类::FUN()
***********************************************************************/


#include "stdafx.h"
#include <iostream.h>

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

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

void FunShow( A* pA )
{
    pA->Show();
}

int main(int argc, char* argv[])

    B theB;
    A theA;
   
    A* pA = NULL;
   
    //
如果FUN是虚函数
    pA = &theA;   
    //a.
如果基类指针指向的是基类对象,执行基类::FUN()
    pA->Show();

    //
如果FUN是虚函数
    pA = &theB;
    //b.
如果基类指针指向的是派生类对象,执行派生类::FUN()
    pA->Show();
   
    //
虽然没有数据成员,但大小都为4
    //
因为virtual 其实就是一个函数指针数组的首地址
    //
一个类中有几个虚函数,数组里边就有几个虚函数地址

    cout << "
基类对象大小" << sizeof(A) << endl;
    cout << "
派生对象大小" << sizeof(B) << endl;

   
    //
基类的指针调用函数FUN pb->Fun();   
    //1
如果FUN是非虚成员函数,那么执行 基类::FUN()
    //2
如果FUN是虚函数       
    //a.
如果基类指针指向的是基类对象,执行基类::FUN()
    //b.
如果基类指针指向的是派生类对象,执行派生类::FUN()


    return 0;
}

posted on 2010-01-26 22:15  o无尘o  阅读(264)  评论(0编辑  收藏  举报