C#中的虚函数有什么作用?

C#中的虚函数有什么作用?,第1张

virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。

ms-help://MSVSCC2003/MSMSDNQTR2003FEB2052/csref/html/vclrfVirtualPGhtm

函数必须是基类的非静态成员函数,其访问权限可以是protected或public,在基类的类定义中定义虚函数的一般形式:

  virtual 函数返回值类型 虚函数名(形参表)

  { 函数体 }

 虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型。以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。

  当程序发现虚函数名前的关键字virtual后,会自动将其作为动态联编处理,即在程序运行时动态地选择合适的成员函数。

  ([20101028] 注:下行语义容易使人产生理解上的偏差,实际效果应为:

  如存在:Base -> Derive1 -> Derive2 及它们所拥有的虚函数func()

  则在访问派生类Derive1的实例时,使用其基类Base及本身类型Derive1,或被静态转换的后续派生类Derive2的指针或引用,均可访问到Derive1所实现的func()。)

  动态联编规定,只能通过指向基类的指针或基类对象的引用来调用虚函数,其格式:

  指向基类的指针变量名->虚函数名(实参表)

  或 基类对象的引用名 虚函数名(实参表)

  虚函数是C++多态的一种表现

  例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。

  使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。 如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual 函数名=0 我们把这样的函数(方法)称为纯虚函数。

  如果一个类包含了纯虚函数,称此类为抽象类 。

虚函数的实例

  #include<iostreamh>

  class Cshape

  { public: void SetColor( int color) { m_nColor=color;}

  void virtual Display( void) { cout<<"Cshape"<<endl; }

  private:

  int m_nColor;

  };

  class Crectangle: public Cshape

  {

  public:

  void virtual Display( void) { cout<<"Crectangle"<<endl; }

  };

  class Ctriangle: public Cshape

  {

  void virtual Display( void) { cout<<"Ctriangle"<<endl; }

  };

  class Cellipse :public Cshape

  {

  public: void virtual Display(void) { cout<<"Cellipse"<<endl;}

  };

  void main()

  {

  Cshape obShape;

  Cellipse obEllipse;

  Ctriangle obTriangle;

  Crectangle obRectangle;

  Cshape pShape[4]=

  { &obShape, &obEllipse,&obTriangle, & obRectangle };

  for( int I= 0; I< 4; I++)

  pShape[I]->Display( );

  }

  本程序运行结果:

  Cshape

  Cellipse

  Ctriangle

  Crectangle

条件

  所以,从以上程序分析,实现动态联编需要三个条件:

  1、 必须把动态联编的行为定义为类的虚函数。

  2、 类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来。

  3、 必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。

作用:虚函数的作用就是将接口(函数调用)与实现(函数定义)分开, 就是实现所谓的多态行为。也就是说虚函数提供了让你修改基类函数定义的机会。这里虽然你定义了一个派生类但是这个派生类任然可以按照基类的方式使用,即将派生类对象传递给需要基类引用、指针的函数。

定义: 在一个类中,一个由virtual 关键字修饰的函数声明表示这个函数声明所对应的函数调用既要服务于本类中的函数定义也要服务于派生类中的函数定义,相当于一个接口的作用。

一段良好的代码通常只使用基类提供的接口来编写,那些与派生类相关的代码单独放在一个地方(工厂)。

例子:

        

        

class Window {

        public:

            virtual void drawEvent(void event);   /

            virtual void keyEvent(void event);

            virtual void mouseEvent(void event);

            virtual void addWindow(Window window);

            void show();

            virtual ~Window();   // 用到继承, 基类的析构函数必须声明为虚函数,否则是逻辑错误

            

        };

        

        class Button : public Window {

        public:

            // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为

            void drawEvent(void event);

            void keyEvent(void event);

            void mouseEvent(void event);

            void setText(const std::string label);

            

        };

        

        class Menu;

        class MenuBar : public Window {

        public:

        // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为

            void drawEvent(void event);

            void mouseEvent(void event);

            void addWindow(Window m);

            

        };

        

    class Menu : public Window {

    public:

    // 以下声明表示重新定义基类的虚函数的函数体,改变基类相应函数的行为

        void drawEvent(void event);

        void mouseEvent(void event);

        void keyEvent(void event);

    };

    

    void userCode(Window &win, Window &win2) {

        winaddWindow(win2); //用户代码只用到了基类的引用

    }

    int main() {

        Window mainWindow();

        MenuBar menuar();

        Menu fileMenu();

        Button button();

        usrCode(mainWindow, menuBar); //将MenuBar对象当做Window引用来使用,由于定义了虚函数,所以usrCode会使用我们重定义的代码

        usrCode(menuBar, fileMenu);   //

        usrCode(mainWindow, button);  //

        mainWindowshow();

}

C++中的虚函数和纯虚函数用法 1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class) 只有声明而没有定义。 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。 5. 虚函数的定义形式:virtual {method body} 纯虚函数的定义形式:virtual { } = 0; 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。 6 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC)是不能被直接调用的。必须被子类继承重载以后,根据要求调用其子类的方法。 以下为一个简单的虚函数和纯虚寒数的使用演示,目的是抛砖引玉! #include //father class class Virtualbase { public: virtual void Demon()= 0; //prue virtual function virtual void Base() {cout<<"this is farther class"<}; //sub class class SubVirtual :public Virtualbase { public: void Demon() { cout<<" this is SubVirtual!"< void Base() { cout<<"this is subclass Base"<}; / instance class and sample / void main() { Virtualbase inst = new SubVirtual(); //multstate pointer inst->Demon(); inst->Base(); // inst = new Virtualbase(); // inst->Base() return ; } 如有问题请联系qq:601333488 望采纳

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12188961.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存