C++基础#12:多态性与虚函数,重载函数,纯虚函数

《面向对象程序设计C++》期末考试试卷 《面向对象程序设计C++》期末考试试卷一、选择题(每小题3分,共48分。)01、下列关于C++函数的叙述中,正确的是( C )。A)每个函数至少要具有一个参数 B)每个函数都必须返回一个值C)函数在被调用之前必须先声明 D)函数不能自己调用自己02、下列关于类和对象的叙述中,错误的是( A )。A)一个类只能有一个对象 B)对象是类的具体实例C)类是对某一类对象的抽象 D)类和对象的关系是一种数据类型与变量的关系03、在C++中,用于实现运行时多态性的是( D )。A)内联函数 B)重载函数 C)模板函数 阅读详情

多态性概念:

在面向对象的概念中,多态性是指不同对象接收到相同消息时,根据对象类的不同产生不同的动作。多态性提供了同一个接口可以用多种方法进行调用的机制,从而可以通过相同的接口访问不同的函数。具体地说,就是同一个函数名称,作用在不同的对象上将产生不同的操作。

    多态性提供了把接口与实现分开的另一种方法,提高了代码的组织性和可读性,更重要的是提高了软件的可扩充性。


一. 重载函数
1. 在C++语言中,编译程序选择相应的重载函数版本时函数返回值类型是不起作用的。不能仅靠函数的返回值来区别重载函数,必须从形式参数上区别开来。例如:
void print(int a);
void print(int a,int b);
int print(float a[]);
这三个函数是重载函数,因为C++编译程序可以从形式参数上将它们区别开来。

但是:
int f(int a);
double f(int a);
不能进行重载,会发生编译错误。

2. 函数重载的二义性(ambiguity):
  (1). 是指C++语言的编译程序无法在多个重载函数中选择正确的函数进行调用。这些二义性错误是致命的,因而编译程序将无法生成目标代码。
函数重载的二义性主要源于C++语言的隐式类型转换与默认参数.


  (2). 在重载函数中使用默认参数也可能造成二义性

3. 析构函数不能进行重载,因为析构函数本来就是无参数的,无返回类型的。

重载函数举例1:

/* 例1:test1.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */
/* 重载函数举例 */

#include <stdio.h>
class base
{
    public:
           //构造函数重载
           base():i(0){ };
           base(int x) { i = 10; }
           //base (int y){ j = 20; } // compile error: F:/devcpptest/devcpptest/test1.cpp `base::base(int)' and `base::base(int)' cannot be overloaded
                                       //形式与上一个一样。
           base(int x,int y) { i = x; j = y; }
          
          
           int get_i(){ return i; }
          
           //其它函数重载:
           void  display(){ printf(" base::display_i, i = %d, j = %d /n", i, j); } 
           void  display(int type)
           {
                 if (type)
                    printf(" base::display, i = %d/n", i);
                 else
                     printf(" base::display, j = %d /n", j);
           }
          
           float abs(float x)
           {
               return (x>0?x:-x);
           }
           double abs(double x)
           {
               return (x>0?x:-x);
           }

           //析构函数不能重载:
           ~base(){};
           //~base(int type) { i = type; } //compile error: F:/devcpptest/devcpptest/test1.cpp `base::~base()' and `base::~base()' cannot be overloaded
          
    private:
            int i;
            int j;
};


int main()
{
    base b;
    printf("abs(1.78) = %f /n", b.abs(1.78)) ; // OK, 调用abs(double)
    //printf("abs(-7) = %f /n", b.abs(-7));    // compile error,编译程序无法确定调用哪一个abs()函数

    while(1);
}

二. 虚函数

虚函数是重载的另一种形式,实现的是动态的重载,即函数调用与函数体之间的联系是在运行时才建立,也就是动态联编。
在基类用virtual声明的成员函数即为虚函数。

1. 静态联编与动态联编
   (1)静态联编:是指联编工作出现在编译连接阶段,这种联编过程是在程序开始运行之前完成的。在编译时所进行的这种联编又称静态绑定。
        在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又称为绑定,在编译时绑定又称静态聚束。
   (2)动态联编:编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,
        为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行的联编工作被称为动态联编,或称动态绑定。
        动态联编实际上是进行动态识别。
   (3)比较:

程序中的形式

聚束方式

函数原型

决策依据

特点

重载函数

静态聚束

不同

参数数目及类型

高效

虚函数

动态聚束

相同

运行时指针的指向或引用

高效灵活,抽象性,可扩充性


  
2. 虚函数的概念
   虚函数是在基类中冠以关键字 virtual 的成员函数。它是动态联编的基础。虚函数是成员函数,而且是非static的成员函数。
   它提供了一种接口界面,并且可以在一个或多个派生类中被重定义。
   一个虚函数是属于它所在的类层次结构的,而不是只属于某一个类。
3. 动态联编与虚函数
   派生类中对基类的虚函数进行替换时,要求派生类中说明的虚函数与基类中的被替换的虚函数之间满足如下条件:
(1)与基类的虚函数有相同的参数个数;
(2)其参数的类型与基类的虚函数的对应参数类型相同;
(3)其返回值或者与基类虚函数的相同,或者都返回指针或引用,
     并且派生类虚函数所返回的指针或引用的基类型是基类中被替换的虚函数所返回的指针或引用的基类型的子类型。
(4)在派生类对基类中声明为虚函数进行重新定义时,关键字virtual也可以不用写,即 对于下面的代码:

class Point {
    private:
        flat x,y;
    public:
        virtual float area() // 虚函数
        {
            return 0.0;
        }/
    };
    const float PI = 3.141593;
    class Circle: public Point {
    private:
        float radius;
    public:
        virtual float area()
        {
            return PI*radius*radius;
        }
    };

 
    派生类类中的virtual float area() 也可以写成下面的形式:
    float area()。

4. 虚函数的限制

(1)在类体系中访问一个虚函数时,应使用指向基类类型的指针或对基类类型的引用,以满足运行时多态性的要求。
(2)在派生类中重新定义虚函数时,必须保证该函数的值和参数与基类中的说明完全一致,否则就属于重载(参数不同)或是一个错误(返回值不同)。
(3)若在派生类中没有重新定义虚函数,则该类的对象将使用其基类中的虚函数代码。
(4)虚函数必须是类的一个成员函数,不能是友元,但它可以是另一个类的友元。
(5)析构函数可以是virtual的虚函数,但构造函数则不得是虚函数。
(6)一个类的虚函数仅对派生类中重定义的函数起作用,对其他函数没有影响。

5. 虚函数与重载函数的比较
(1)重载函数要求函数有相同的返回值类型和函数名称,并有不同的参数序列;而虚函数则要求这三项(函数名、返回值类型和参数序列)完全相同。
(2)重载函数可以是成员函数或友元函数,而虚函数只能是成员函数。
(3)重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据;虚函数是根据对象的不同去调用不同类的虚函数。
(4)虚函数在运行时表现出多态功能,这是C++的精髓;而重载函数则在编译时表现出多态性。

6. 虚函数的访问:
(1)用基指针访问与用对象名访问;
     虚函数被指向基类的指针(或引用)调用时,C++对其进行动态聚束,向实际的对象传递消息。
     但是,通过一个对象名访问虚函数时,C++系统将采用静态聚束。
     例如,对于上面的Point 和 Circle 类,
     Point *pp;
     Circle c;
     pp = &c;
     pp->area(); //调用的是Circle的area
     调用的是Circle的area;
     而,
     Circle c;
     c.area();            // 调用的是本类Circle的area。
     c.Point::area();     // 调用的是父类Point的area,采用作用域运算符来指定调用父类的方法。
     c.Circle::area();    // 调用的是本类Circle的area。
    
    

(2)由类的成员函数访问该类层次中的的虚函数,要使用this指针;例如,

虚函数举例:

/* 例2:test2.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */
/* 虚函数举例 */


      #include <stdio.h>
     
      class A {
            public:
                   virtual void vir_func1() {
                       printf(" v1 is called in A./n");
                       a1();
                   }
                   virtual void vir_func2() {
                       printf(" v2 is called in A./n");
                   }
                   void a1() {
                       printf(" a1 is called in A./n");
                       vir_func2();  // 等价于 this->vir_func2()
                   }
      };
     
      class B: public A {
            public:
                  
                   virtual void vir_func2() {
                       printf(" v2 is called in B./n");
                   }
                   void b1() {
                       printf(" b1 is called in B./n");
                       vir_func2();
                   }
      };
      int main()
      {
          A a;
          a.vir_func1();
          printf(" OK./n");
         
          B b;
          b.vir_func1();
         
          while(1);
          return 0;
      }

运行结果:

/*
      result:
            v1 is called in A.
            a1 is called in A.
            v2 is called in A.
            OK.
            v1 is called in A.
            a1 is called in A.
            v2 is called in B.
           
      */

    
(3)用构造函数和析构函数访问:
     这两个函数访问虚函数时,C++采用静态聚束。例如,

构造函数访问虚函数举例:

/* 例3:test3.cpp   */
/* IDE环境: Dev-C++ 4.9.9.2 */
/* 构造函数访问虚函数举例 */
      #include <stdio.h>
     
      class A {
            public:
                   A() { };
                   virtual void vir_func1() {
                       printf(" v1 is called in A./n");
                   }
      };
     
      class B: public A {
            public:
                   B() {
                       printf(" call v1 in B./n");
                       vir_func1(); //  调用本类中定义的虚函数
                   }
                   virtual void vir_func1() {
                       printf(" v1 is called in B./n");
                   }
      };
     
      class C: public B {
            public:
                   C() {
                       printf(" call v1 in C./n");
                       A::vir_func1();  // 调用基类中定义的虚函数
                   }
                   void vir_func1() {
                       printf(" v1 is called in C./n");
                   }
      };
      int main()
      {
          B b;
          printf(" OK./n");
         
          C c;
        
          while(1);
          return 0;
      }
      

运行结果:

/*
      result:
            call v1 in B.
            v1 is called in B.
            OK.
            call v1 in B.
            v1 is called in B.
            call v1 in C.
            v1 is called in A.
           
      */

 7. 多基派生中虚函数的二义性 :

在本博的"继承"一篇中,提到了"同一基类多次拷贝引起的二义性",消除这种二义性的方法是把公共基类定义为虚基类。

同样,多基派生中,虚函数也有这样的问题。具体来说,有两种场景:

(1) 函数被定义为虚函数,但基类不是虚基类;

(2) 函数被定义为虚函数,基类也被定义成虚基类。

首先,看第一种情形:函数被定义为虚函数,但基类不是虚基类。

下面程序中,

A *a = &d 语句是错误的。

因为不能使用指向公共基类A的指针来访问多条路径汇聚处的派生类D的对象。

例如:

/* IDE环境: Dev-C++ 4.9.9.2 */

/* 例4: virtual2.cpp */



#include <stdio.h>

         

    class  A 

    {

           public :

                  virtual void test_func1() { printf("A::test_func1() /n"); }

                  virtual void test_func2() { printf("A::test_func2() /n"); }

                  virtual void test_func3() { printf("A::test_func3() /n"); }

     };

   

    class  B :  public  A

    {

           public :

                  virtual void test_func1() { printf("B::test_func1() /n"); }

                  virtual void test_func2() { printf("B::test_func2() /n"); }

    };

   

    class  C :  public  A

    {

           public :

                  virtual void test_func1() { printf("C::test_func1() /n"); }

                  virtual void test_func2() { printf("C::test_func2() /n"); }

                                  

    };

   

    class  D : public  B , public  C

    {

           public :

                  virtual void test_func1() { printf("D::test_func1() /n"); }

    };

   

    int main()

    {

        D d;

        //A *a = &d; // compile error: D:/devcpptest/virtual2.cpp `A' is an ambiguous base of `D'

                     // 因为:不能使用指向公共基类A的指针来访问多条路径汇聚处的派生类D的对象。

       

        B *b = &d; //OK. 可以使用指针指向类层次结构中无分支的某条路径上的某个类

        b->test_func1(); // 调用 D的test_func1

        b->test_func2(); // 调用 B的test_func2 

        b->test_func3(); // 调用 A的test_func3

       

        while(1);

        return 0;

    }

运行结果:

/* result:

          D::test_func1()

          B::test_func2()

          A::test_func3()

*/

   

从例4可以看出,在这种场景下,有:

 (1) 不能使用指向公共基类A的指针来访问多条路径汇聚处的派生类D的对象。

 (2) 只可以使用指针指向类层次结构中无分支的某条路径上的某个类。

 (3) 派生类中定义的函数可以覆盖基类中的同名函数,虚函数也不例外。

再看第二种情形:虚基类中含有虚函数

在例4类的定义的基础上,将基类A定义为B和C的虚基类,如下,

     class  B : virtual public  A

     class  C : virtual public  A,

    

在这样的类层次结构中,就可以使用指向公共基类指针来访问派生类对象了,但是,这和编译器相关。

有的编译器认为这种用法是正确的,有的认为是非法。

如下:   

int main()

    {

        D d;

        A *a = &d;

        a->test_func1(); // 

        a->test_func2(); //  有的编译器认为这种用法是正确的,有的认为是非法。  

        a->test_func3(); // 

       

        while(1);

        return 0;

    }

这时,会产生对函数test_func2()引用的二义性,因为test_func2()没有在D中重新定义,

即在对象d中继承的test_func2()来自B还是C呢?这和编译器有关。有的编译器(如Borland C++)

会以B与C作为D的基类的顺序有关,哪个在前,就用以哪个为准。GCC编译器会报错。

在Borland C++ 中,上面运行的结果是:

运行结果:

/* result:

          D::test_func1()

          B::test_func2() //因为是 class  D : public  B , public  C

                          //而不是 class  D : public  C , public  B

          A::test_func3()

*/

/* 说明:

result:

1.  Borland C++ 中,正确运行, 结果如下:

          D::test_func1()

          B::test_func2() //因为是 class  D : public  B , public  C

                          //而不是 class  D : public  C , public  B

          A::test_func3()

2.  VC6.0中,会有编译错误: 'D' : ambiguous inheritance of 'B::test_func2'

                                                   'D' : ambiguous inheritance of 'C::test_func2'

     Dev-C++ 4.9.9.2中,会有编译错误: no unique final overrider for `virtual void A::test_func2()' in `D'

*/

8. 再给出一个虚函数的例子:

/* 例5:virtual3.cpp   */

/* IDE环境: Dev-C++ 4.9.9.2 */

/* 虚函数举例 */





#include <stdio.h>

class point

{

      private:

              float x,y;

      public:

             point(){printf("point::point/n");}

             point(float i,float j)

             {

                 printf("point::point(i,j)/n");

                 x =i;

                 y =j;

             }

             virtual float area()

             {

                   return 0.0;

             }

             float girth()

             {

                   printf("point::girth/n");

                   return 0.0;

             }

      private:

              void print()

              {

                   printf("point::print/n");

              }

};



const float PI = 3.14;

class circle1: public point

{

      private:

              float r;

      public:

             circle1(float r)

             {

                 printf("circle1::circle1/n");

                 this->r = r;

             }

             float area()

             {

                   return PI*r*r;

             }

             float gir()

             {

                   printf("circle1::gir/n");

                   return PI*2*r;

             }

     

                  

};



int main()

{

     point *pp;

     circle1 c1(5.1);

     pp = &c1;

     printf("area of c1 = %f/n",pp->area());         //81.671700

     printf("area of c1 = %f/n",c1.point::area());   //0.000000

     printf("area of c1 = %f/n",c1.area());          //81.671700

    

     point *p = new circle1(2);  //1.其实是new了一个circle1的对象,而基类指针p又指向

                                 //这个对象,使得p可以访问circle1的area函数.

                                 //2.又由于这是一个point的指针,所以可以访问point的函数.

                                 //又,既然对象是circle1类型的,它继承了point的public函数,

                                 //所以,p肯定能够访问到自己类型的函数.

                                 //3.那么,circle1不继承point的private函数,p还能够访问

                                 //point的private函数么? 当然不能了,因为new的对象是

                                 //circel1的.p指向的实际上是circle1类型的对象,而这个

                                 //对象并没有继承point的private的函数.

                                

     printf("area of p = %f/n",p->area()); //12.560000

    

    

     p->girth(); //ok,

     //p->print(); //error  

     //p->gir();  //error  

     //girth is function of point, gir is function of circle1,可以看出,p的确是

     //point的指针,而这个基类指针是可以访问派生类的area函数(这正是virtual function

     //的作用.但是,p不能访问派生类的gir函数,因为这个函数不是point的成员函数.

     while(1);

}

运行结果:

/* result:

    point::point

    circle1::circle1

    81.671400

    0.000000

    81.671400

    point::point

    circle1::circle1

    area of p = 12.560000

    point::girth

*/

9. 后记:关于多态,虚函数,抽象类,纯虚函数这几个重要的概念与应用,请参考以下书籍:

    effectivec++

    c++编程思想第二版

    c++程序设计语言第三版

    C++ Primer 3rd Edition


继承,封装,多态,虚函数,抽象类,纯虚函数...

Windows 10/11 零基础配置 SillyTavern 连接 Claude API 完整指南(含 Node.js 环境搭建) 本文提供Windows 10/11系统下零基础配置SillyTavern连接Claude API的完整教程,涵盖Node.js环境搭建、SillyTavern初始化及API连接配置等关键步骤。通过详细的操作指南和实用技巧,帮助用户快速搭建AI聊天界面并优化对话体验,实现与Claude AI的高效交互。 阅读详情

相关推荐

PyCharm中Matplotlib中文显示问题的终极解决方案

本文详细解析了PyCharm中Matplotlib中文显示问题的根本原因,并提供了从简单三行代码到深入配置的多套解决方案。针对Windows、Mac和Linux不同系统环境,分别推荐了最优字体配置方案,同时涵盖了PyCharm特定环境下的后端设置、字体路径指定等高级技巧,帮助开发者彻底解决中文乱码问题。

weixin_28221501的博客 303

虚函数和函数重载

函数重载: 面向对象编程过程中,针对定义大量的函数,函数命名难度开始出现,为了解决此问题,希望通过函数重名来达到简化编程的目的。 例如,要声明两个求绝对值的函数:int abs(int); double abs(double);C++完全可以同时定义以上两个函数而不会引起函数意义上的冲突。 C++编译器可以根据函数参数的类型、数量和排列顺序的差异,来区分同名函数,这种技术成为

fenxinzi557的博客 5006

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

C++的重载与虚函数

 C++的重载与虚函数 其实真正要说的是虚函数,不过其中要扯倒重载,所以顺便也说了下重载1. 重载1.1 简单重载      在C++中,是允许同名函数的存在int add(int i,int j);float add(float i,float);      而在c中,函数名是唯一的,所以为了区分int和float版本的add,你需要给它们起不同的名字,比如将in

ariel7321的专栏 1548

LVDS信号调试必备:5分钟搞懂Xilinx IDELAYE3的TIME模式校准

本文深入解析了在Xilinx Ultrascale系列FPGA中调试LVDS信号时,如何正确使用IDELAYE3的TIME模式进行精密延迟校准。文章重点阐述了IDELAYCTRL、EN_VTC管脚与校准状态机的协同工作机制,揭秘了内置自校准(BISC)中Align_Delay的影响,并提供了从抽头值计算到实际眼图优化的完整实战方案,帮助工程师快速解决高速接口的时序问题。

joy55的博客 216

高压控制单元与接触器 —— BMS电池的“高压大门”

高压接触器在BMS电池管理系统中扮演着“高压大门”的角色,负责控制电池包与整车高压母线的连接与隔离。接触器的工作原理基于线圈产生的磁力吸合接点,通过主触点接通高压电流路径,辅助触点检测状态,灭弧结构保护接点。预充电路的设计是为了避免直接连接大电容时产生的浪涌电流冲击,通过预充电阻逐步充电,确保系统安全上电。接触器控制策略包括顺序控制、辅助触点检测、温度监控、故障断电和背靠背MOS辅助控制,以确保系统的高效和安全运行。工程师在选择接触器型号、控制线圈、检测状态、软件冗余控制和预充失败保护等方面提供了具体建议。

weixin_43199439的博客 812

C++中的虚函数重载

在一次修改代码过程中踩的坑,下来研究了一下,发现C++中虚函数重载后会产生很多有意思的情况,在这里总结了一下。 C++中有重载(overload)和重写(override)以及重定义这几个概念,1 overload:指的是相同作用域中的两个函数的函数名相同,但参数列表的个数、顺序、类型不同。而override指的是子类中重新定义的父类的虚函数。 2 override:overload要求两

rockly89的博客 1万+

华为OD机试 - 不含101的数(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。小明在学习二进制时,发现了一类不含101的数,也就是:现在给定一个正整数区间,请问这个区间内包含了多少个不含101的数?输入的唯一一行包含两个正整数。输出的唯一一行包含一个整数,表示在区间内一共有几个不含101的数。8 1668 → “1000”

学Java,找哪吒 1250

C++中虚函数与纯虚函数(以及函数重写/重载,隐藏,多态等

虚函数与纯虚函数 定义 类中声明前带有virtual关键字的函数称为虚函数: class A { virtual void example(); } 类中申明格式如下的函数称为纯虚函数: class A { virtual void example() = 0; } 即在函数声明中含有virtual和= 0两个关键字。 区别 纯虚函数的特点: 只有声明,没有实现/定义 含有纯虚函数的类称为抽象类,抽象类不能被实例化 抽象类的派生类如果想成为具体的类(能够被实例化),则必须重写纯虚函数。

weixin_41694059的博客 1万+

网络工程师教程第6版(2024年最新版)

本书 根据《网络工程师考试大纲》(2024年审定通过)编写,对网络工程师岗位所要求的主要知 识及应用技术进行了阐述。本书主要内容包括数据通信、局域网、无线通信网、网络互连、网络安全、网络操作系统与应用服务器、组网技术、网络管理、网络规划和设计。本书是参加网络工程师考试的必备教材,也可作为网络工程从业人员学习网络技术的教材或日常工作的参考用书。王涛和严体华编写了第2章、第3章和第4章;网络工程师教程(第6版)由清华大学出版社出版,由工业和信息化部教育与考试中心组编,张永刚、王涛、高振江任主编,具体介绍如下。

鹿鸣天涯 6901

HCIE-Datacom笔试题库

关于HCIE Datacom笔试考试题目整理!

坏坏-5的博客 608

C++基础 虚函数、重载、覆盖、隐藏

2014-04-09      0 个评论    来源:C++基础(五)虚函数、重载、覆盖、隐藏   收藏    我要投稿 虚函数总是跟多态联系在一起,引入虚函数可以使用基类指针对继承类对象进行操作! 虚函数:继承接口(函数名,参数,返回值),但是实现不继承(函数体) 非虚函数:继承接口,也继承实现; 1)虚析构函数(当一个类打算作为基类使用时候,其析构函数必须是

lycnjupt的专栏 636

基于STM32与FPGA的数据采集系统的设计与实现

数据采集系统在现代工程中起着至关重要的作用,用于实时获取和处理各种传感器或外部设备的数据。在本文中,我们将探讨如何基于STM32微控制器和FPGA(现场可编程门阵列)实现一个高效的数据采集系统。我们可以使用STM32的UART、SPI或I2C接口与各种传感器或外部设备进行通信,并通过GPIO口实现控制功能。在硬件连接完成后,我们可以通过STM32控制FPGA的配置和数据传输。STM32作为主控单元负责与外部设备进行通信和数据处理,而FPGA则用于高速数据采集和实时处理。具体的通信协议取决于连接的设备类型。

UbiSqlserver的博客 1797

C++虚函数与多态性

》多态性的概念         一个面向对象的系统常常要求一组具有相同基本语义的方法能在同一接口下为不同的对象服务,这就是多态性(polymorphism)。与传统的面向过程的高级语言相比,C++不但提供了固有的多态性,还提供了实现自定义多态性的手段。多态性使得不同的但又具有某种共同属性的对象不但能在一定程度上共享代码,而且还能共享接口。这就大大提高了系统的一致性、灵活性和可维护性。     

愚 公 1245

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C++ 虚函数与多态性

一、 参考文献: 【1】C++:为什么在继承关系中,父类的析构函数最好定义为虚函数?:https://blog.youkuaiyun.com/han8040laixin/article/details/81704165

灰太狼的小秘密 1399

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++中的虚函数、纯虚函数区别和联系

C++中的虚函数、纯虚函数区别和联系虚函数和纯虚函数有以下所示方面的区别。 (1)类里如果声明了虚函数,这个函数是实现的,哪怕是空实现,它的作用就是为了能让这个函数在它的子类里面可以被覆盖,这样的话,这样编译器就可以使用后期绑定来达到多态了。纯虚函数只是一个接口,是个函数的声明而已,它要留到子类里去实现。 (2)虚函数在子类里面也可以不重载的;但纯虚函数必须在子类去实现,这就像Java的接口一样

1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++面向对象之类的继承与派生、虚继承、虚函数、多态性、纯虚函数、抽象类、虚析构函数

实际上继承和派生是一个意思,只是说站在不同的角度来看而已。基类派生出派生类,派生类继承自基类。 继承的方式 首先已经定义了一个基类BaseClass,再定义一个类ChildClass,继承自这个基类,格式如下: class ChildClass: [继承方式] BaseClass{ //子类新增的数据成员和成员函数 }; 继承方式有public 、private、protected ,如果不写,默认为private 在派生类中,能够使用的只有public和protected修饰的成员。private成员

Cser_zhu的博客 700

C++一些注意点之友元函数、虚函数以及const和volatile对象

1.友元函数        定义类时,在类中加上关键字修饰函数,则该函数就能成为该类的友元函数,它可以访问该类的所有成员。关于友元函数需要注意以下几点:      (1)友元函数不是类的成员,不带this指针,必须通过对象名或者对象的引用作为友元函数的参数来访问对象的成员。友元函数必须在类定义中说明(但是对友元函数指定访问权限无效,因为友元函数不属于类,所以在类中不管哪声明都是一样的效果)可以

继续微笑lsj 3379

多态与虚函数

#多态的概念 多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。 #静态与动态 多态性分为两类:静态多态性和动态多态性。以前学过的函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此静态多态性又称编译时的多态性。 静态多态性是通过函数的重载实现的( 运算符重载实质上也是函数重载 )。 动态多态性是在程序运行过程中才动...

jklmf1的博客 398

『C++学习录』多态性

Too Hot

你叫什么名字 148

6.C++之虚函数,多态

C++之虚函数,多态 虚函数的使用:    当父类指针或引用指向子类对象,而子类中又覆盖了父类的函数,希望用父类指针或父类引用,调用到正确版本的函数(父类指针或引用实际所指向的对象版本的函数),需要把该成员函数声明为虚函数。 (1) 有了虚函数之后,无需向下转型,就可以正确的用父类的指针或引用,调用到子类的函数; (2)虚函数目的:期望父类指针(或引用),不管指向父类还是子类,在调用overrid...

浩海烟云的博客 472

C++虚函数与JAVA中抽象函数比较 接口与抽象类比较

C++虚函数与JAVA中抽象函数比较 1:java中没有虚函数的概念,但是有抽象函数的概念,用abstract关键字表示,java中抽象函数必须在抽象类中,而且抽象 函数不能有函数体,抽象类不能被实例化,只能由其子类实现抽象函数,如果某个抽象类的子类仍是抽象类,那么该子类不需要实现其父类的抽象函数。 2:C++中的有虚函数的概念,用virtual 关键字来表示,每个类都会有一个虚函数表

Coding for Dreams 7688

c++之多态性入门

C++ — 多态性入门 运算符的重载 1、c++中几乎可以重载所有运算符,而且只能够重载c++中已经有的。 不能重载的运算符:“ . ”、“ .* ”、“::”、“?:” 2、重载之后的运算符的优先级和结合性都不会改变。 3、运算符的重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。 运算符重载为成员函数: 定义形式: 函数类型 operator 运算符(形参) { … … } 参数个数...

shanjixin的博客 513

【C++】多态

多态是C++特性之一,多态性就是使用相同的接口实现不同的方法。多态性分为静态多态性和动态多态性。 在C++中,多态性的实现和联编(或称绑定)这一概念有关。一个源程序经过编译、链接,成为可执行文件的过程是把可执行代码联编在一起的过程。其中在编译时完成的联编称为静态联编(前期联编);而在运行时完成的联编称为动态联编(后期联编)。 静态多态性 静态多态性又可以称为编译时多态性,在C++中,静态多态性是通...

olivertai的博客 185

12 面向对象编程:多态性(cpp大学教程)学习笔记

12.1 类继承层次中对象的关系 将基类指针指向派生类对象 CommissionEmployee * commisssionEmployeePtr = &basePlusCommissionEmployee; 只能调用CommissionEmployee中的方法,而不能调用BasePlusCommissionEmployee类中的方法 注意:被调用的功能取决于调用函数句柄的类型(即引用或者指针),而不是其指向对象的类型 若想调用派生类的功能,则需要进行“向下转换” BasePlusC.

stay_alive001的博客 876

C++中多态怎样由虚函数实现。和纯虚函数介绍

首先,在C++中,多态有两种,函数重载和虚函数。(python中的多态貌似就是只有函数重载..) 粗俗地说:继承意味着,子类可以使用父类的方法,而多态,则是父类可以使用子类的方法。 网上有一句话很好地解释了多态: 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类

ZJE 535
上一篇: Android设计模式:Observer观察者模式在Android中的应用,反向控制
下一篇: C++基础#17:C++中的虚函数表
liranke
博客等级 码龄20年 4939粉丝 594原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值