好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

没有虚函数情况下的函数覆盖(以原始指针的类型为准)

没有虚函数情况下的函数覆盖(以原始指针的类型为准)

#include  "  stdafx.h  "  

#include  <iostream>
 using   namespace   std;

  class   shape
{
  public  :
    shape(){};
      void   draw()
    {
        cout << "   shape   " <<  endl;
    }
};

  class  rectangle :  public   shape
{
  public  :
    rectangle(){};
      void   draw()
    {
        cout << "   rectangle   " <<  endl;
    }
};

  class  round :  public   shape
{
  public  :
    round(){};
      void   draw()
    {
        cout << "   round   " <<  endl;
    }
};

  void   main()
{
    shape  *  s;
    
    s  =  new   rectangle();
    s -> draw();
    
    s  =  new   round();
    s -> draw();
} 

结果输出两个shape

把基类改一改:

 class   shape
{
  public  :
shape(){};
   virtual    void   draw()
{
cout << "   shape   " <<  endl;
}
}; 

就可以输出一个rectangle,一个round了.

虚函数是动态多态性的基础,其调用的方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用基类的还是子类的,系统会根据基类指针所指向的对象来决定要调用的函数); 非虚函数与其相反,是静态联编(调用已经在编译时期就决定了;在编译时期,系统已经根据指针所属的类型确定了要调用的函数) 。

注意:即使不在基类shape当中把draw设置为虚函数,我们只要直接在主函数当中直接声明子类的对象,调用draw,这种情况下是符合多态的思想的,

void main()
{
  round r;
  r.draw();
}
这就有疑问了,为什么还需要virtual关键字(虚函数)的存在呢?

上面的例子只是一个两个派生类,如果shape有成百上千个派生类,难道我们调用派生类的draw的时候都声明一个派生类的对象吗?很明显不可能,所以虚函数的情况下,我们只要声明一个shape的指针就好了。

唯一的好处:简化使用方法。无论在哪里调用,或者传递参数,永远使用那个基类指针就可以了。 它可以自动调用子类的相关函数。

查看更多关于没有虚函数情况下的函数覆盖(以原始指针的类型为准)的详细内容...

  阅读:40次