精华内容
下载资源
问答
  • 【C++】C++多态实现

    2020-06-02 06:48:24
    C++ 多态 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 静态多态 这就是所谓的...

    参考链接:
    1、https://www.w3cschool.cn/cpp/cpp-polymorphism.html

    C++ 多态

    多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

    C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

    静态多态

    这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。

    但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:

    class Shape {
       protected:
          int width, height;
       public:
          Shape( int a=0, int b=0)
          {
             width = a;
             height = b;
          }
          virtual int area()
          {
             cout << "Parent class area :" <<endl;
             return 0;
          }
    };
    

    此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。

    正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

    虚函数

    虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

    我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。

    纯虚函数

    您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

    我们可以把基类中的虚函数 area() 改写如下:

    class Shape {
       protected:
          int width, height;
       public:
          Shape( int a=0, int b=0)
          {
             width = a;
             height = b;
          }
          // pure virtual function
          virtual int area() = 0;
    };
    

    纯虚函数要求派生类必须实现其area功能,否则会有语法错误。

    展开全文
  • 探究C++多态实现原理

    2018-09-24 15:37:55
    探究C++多态实现原理 在之前的博客中讲到了如何使用C++多态的性质,实现面对对象的程序设计。 在这一篇文章中将会从多态的实现原理,_vfptr 以及多态类的内存构建模型上来探究C++多态的实现过程。 从以下代码来讨论...

    探究C++多态实现原理

    在之前的博客中讲到了如何使用C++多态的性质,实现面对对象的程序设计。

    在这一篇文章中将会从多态的实现原理,_vfptr 以及多态类的内存构建模型上来探究C++多态的实现过程。

    从以下代码来讨论:

    #include <iostream>
    using namespace std;
    
    typedef void(*VIRTUALL)();
    
    class Person
    {
    public:
    	virtual void fun1()
    	{
    		cout << endl << "this is Person fun 1" << endl;
    	}
    
    	virtual void fun2()
    	{
    		cout << endl << "this is Person fun 2" << endl;
    	}
    
    	virtual void fun3()
    	{
    		cout << endl << "this is Person fun 3" << endl;
    	}
    };
    
    class Boss :public Person
    {
    public:
    	virtual void fun1()
    	{
    		cout << endl << "this is Boss fun 1" << endl;
    	}
    
    	virtual void fun2()
    	{
    		cout << endl << "this is Boss fun 2" << endl;
    	}
    
    	virtual void fun3()
    	{
    		cout << endl << "this is Boss fun 3" << endl;
    	}
    };
    
    int main()
    {
    	Person p;
    	Boss b;
    	return 0;
    }
    

    在此段代码当中,我们为每个类定义了三个虚函数,并且对他们进行重写,如何监视这两个类的成员。

    运行起来打开监视
    在这里插入图片描述
    发现每个类都有一个 _vfptr (virtual function pointer)指针,指向的是一个数组的首地址,这个数组中存放着函数名,也就是函数地址。

    在C++中,一个指针类型的大小代表这个指针从首地址开始能往后面读到的字节数,比如 char* 类型的指针可以从首地址往后读一个字节大小, int * 类型的指针 能从首地址往后读四字节的大小,以此类推,我们可以将 类对象进行强制类型转换,因为类对象的前四个字节解引用指向的是描述的虚函数数组的地址空间,所以将其进行 int * 类型的地址转换,可以证明我们的猜测。
    代码如下:

    #include <iostream>
    using namespace std;
    
    typedef void(*VIRTUALL)();
    
    class Person
    {
    public:
    	virtual void fun1()
    	{
    		cout << endl << "this is Person fun 1" << endl;
    	}
    
    	virtual void fun2()
    	{
    		cout << endl << "this is Person fun 2" << endl;
    	}
    
    	virtual void fun3()
    	{
    		cout << endl << "this is Person fun 3" << endl;
    	}
    };
    
    class Boss :public Person
    {
    public:
    	virtual void fun1()
    	{
    		cout << endl << "this is Boss fun 1" << endl;
    	}
    
    	virtual void fun2()
    	{
    		cout << endl << "this is Boss fun 2" << endl;
    	}
    
    	virtual void fun3()
    	{
    		cout << endl << "this is Boss fun 3" << endl;
    	}
    };
    
    void PrintVirtual(int * _ptr)
    {
    	for (int i = 0; ; ++i) {
    		if (_ptr[i] == 0)
    			break;
    		else
    		{
    			VIRTUALL* fd = (VIRTUALL*)(_ptr+i);
    			(*fd)();
    		}
    	}
    }
    
    int main()
    {
    	Person p;
    	Boss b;
    	PrintVirtual((int*)(*((int*)&p)));
    	PrintVirtual((int*)(*((int*)&b)));
    	return 0;
    }
    

    实例化出来的类对象 p 和 b,我们先对其进行取地址操作,再强制类型转换为 int * 类型,这样他的前四个字节的就出来了,然后对地址进行解引用,可以得出虚表的首地址,再对其转换为 int *类型,可以实现每次四字节的访问。再对这每次的访问函数进行调用,就明白了其内存模型的构建方式。

    运行结果:
    在这里插入图片描述
    内存构建方式:
    在这里插入图片描述

    展开全文
  • c++多态实现的机制

    2021-05-25 11:49:28
    c++多态实现的机制 1、 什么是多态? 顾名思义就是同一事物在不同场景的不同形态。 静态多态是在编译期间编译器可以根据实参来确定的,主要体现在两个方面函数重载和泛型。 函数重载 int Add(int left, int ...

    c++多态实现的机制

    1、 什么是多态?

    顾名思义就是同一事物在不同场景的不同形态。

    这里写图片描述

    静态多态是在编译期间编译器可以根据实参来确定的,主要体现在两个方面函数重载和泛型。

    函数重载

    int Add(int left, int right)
    {
        return left + right;
    }
    double Add(double left, int right)
    {
        return left + right;
    }
    
    int main()
    {
        Add(10, 20);
        Add(10.0,20);    
        return 0;
    }

    2、泛型

    vector<int> a;

    vector<double> b;

     

     

    动态多态

    什么是动态多态?

    动态多态,顾名思义就是在程序运行时期才能确定的多态,通过指针和引用所指对象来确定调用哪个类的虚函数。

    动态多态的条件:
    ●基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写
    ●通过基类对象的指针或者引用调用虚函数。

    重写 :
    (a)基类中将被重写的函数必须为虚函数(上面的检测用例已经证实过了)
    (b)基类和派生类中虚函数的原型必须保持一致(返回值类型,函数名称以及参数列表),协变和析构函数(基类和派生类的析构函数是不一样的)除外

    协变:基类(派生类)的虚函数返回基类(派生类)的指针(引用)

    总结一道面试题:

    什么函数不能定义为虚函数?

    静态成员函数(没有this)

    析构函数

    全局函数(没有this)

    友元函数(没有this)

     

     

     

    展开全文
  • C++ 多态实现

    2019-09-12 20:48:30
    多态的含义为 一个事物的多种形态,在C++程序设计张,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。 一般多态分为两种 1)静态多态 也成为编译多态,主要包括参数...

    多态

    多态的含义为 一个事物的多种形态,在C++程序设计张,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。 一般多态分为两种

    1)静态多态

     也成为编译多态,主要包括参数多态,过载多态强制多态。 

        参数多态:采用参数化模板,通过给出不同的类型参数,使的一个结构有多种类型。如C++语言中的函数模板和类模板。如 C++语言中的函数模板和类模板属于参数多态。参数多态又叫静态多态,它的执行速度快,异常少,调用在编译时已经确定。过载多态:同一个名字在不同的上下文中所代表的含义不同。典型的例子是运算符重载和函数重载。强制多态:编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,编译程序一般都会进行强制多态。程序员也可以显示地进行强制多态的操作。如 int+double,编译系统一般会把 int 转换为 double,然后执行 double+double 运算,这个int->double 的转换,就实现了强制多态,即可是隐式的,也可显式转换。强制多态属于静态多态。
     

    2)动态多态

    也称运行时多态

    主要包括:包含多态。包含多态的基础是虚函数。主要是通过类的继承和虚函数来实现,当基类和子类拥有同名同参同返回的方法,且该方法声明为虚方法,当基类对象,指针,引用指向的是派生类的对象的时候,基类对象,指针,引用在调用基类的方法,实际上调用的是派生类方法。

     

     

     

    静态多态实现

    静态多态靠编译器来实现,简单来说就是编译器对原来的函数名进行修饰。可以根据函数参数的类型,个数,以及修饰函数const,这就使得函数可以重载。同理,模板也是可以实现的,针对不同类型的实参来产生对应的特化的函数,通过增加修饰,使得不同的类型参数的函数得以区分。

    动态多态的实现

    动态多态靠运行时的类型检查,从而来进行函数的绑定。声明一个类时,如果类中有虚方法,则自动在类中增加一个虚函数指针,该指针指向的是一个虚函数表,虚函数表中存着每个虚函数真正对应的函数地址。动态多态采用一种延迟绑定技术,普通的函数调用,在编译期间就已经确定了调用的函数的地址,所以无论怎样调用,总是那个函数,但是拥有虚函数的类,在调用虚函数时,首先去查虚函数表,然后在确定调用的是哪一个函数,所以,调用的函数是在运行时才会确定的。
     

    展开全文
  • C++多态实现机制

    2018-05-18 15:38:10
    转自:...多态实现的关键技术是动态绑定。动态绑定:程序在运行期间寻找函数地址静态绑定:代码在编译时已经确定了函数地址 多态的实现表象是指针+虚函数,本质是虚表+虚指针。这里有一篇...
  • C++多态实现计算器

    2020-08-23 14:51:51
    C++多态是非常重要的一个概念,多态编程虽然会使代码量变多,但是他的优点也是非常的明显。 #include <iostream> using namespace std; class Calculator { public: int m_Num1; int m_Num2; virtual ...
  • 它是根据类的继承关系和虚函数来实现的,目的是建立一种通用的过程. 虚函数:定义格式: vritual 返回类型 函数名(参数列表)  virtual 仅用于类定义中,在类外定义,不可加virtual.  
  • C++多态实现——虚函数表 C++虚函数 虚函数是用来实现C++的多态,是OOP【封装,继承,多态】思想中最终要的点. 一句话说父类定义虚函数,子类重写虚函数实现覆盖(Override),然后通过指向子类的父类指针,...
  • C++多态实现

    2011-10-19 15:54:56
    C++多态实现,详细讲述了C++中实现多态的过程,教会怎样运用多态解决实际问题。
  • 多态实现的三个条件: 1.必须是公有继承 2.必须是通过基类的指针或引用 指向派生类对象 访问派生类方法 3.基类的方法必须是虚函数,且完成了虚函数的重写
  • c++ 多态实现机制

    2015-04-24 20:48:42
    一篇讲得还可以的的多态实现机制的博文,先记录下来:http://blog.csdn.net/zyq0335/article/details/7657465
  • 深入理解c++多态实现原理

    万次阅读 2018-05-20 01:54:00
    多态是面向对象编程的核心思想之一,因此我们有必要深入探索一下它的实现原理。理解了原理才能更好的使用。前置条件 现有代码如下所示,非常简单的例子。通过基类的引用调用recv函数来触发多态。接下来的分析涉及...
  • 主要介绍了C++多态实现机制理解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 主要介绍了C++ 多态实现及原理,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • C++多态三种实现方式

    千次阅读 2020-10-14 19:52:01
    多态实现方式分为三块:重载、重写、重定义。下面我们来谈一谈他们各自的实现方式和实现原理。 重载 实现方式 重载是在同一作用域内(不管是模块内还是类内,只要是在同一作用域内),具有相同函数名,不同的形参...
  • 昨天看了下耗子叔的c++虚函数表的实现,想起看《Inside_the_C++_Object_Model 》里指针修正的过程,做了下试验,发现将子类地址赋值给基类指针的过程中确实会将基类指针进行修正,谷歌上搜了搜没发现有中文博客涉及...
  • C++多态实现的机制

    2011-09-12 16:36:07
    在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当
  • C++ 多态

    2021-08-02 20:50:38
    C++ 多态C++ 多态静态联编动态联编静态多态动态多态多态原理多态案例 - 计算器案例纯虚函数和抽象类虚析构和纯虚析构向上类型转换和向下类型转换重载、重写、重定义多态案例2 - 电脑组装案例 C++ 多态 静态联编动态...
  • C++多态实现方式总结

    万次阅读 2015-11-30 14:45:52
    实现多态有两种方法: 1、覆盖 *********** 覆盖是指子类重新定义父类的虚函数的做法。 2、重载 *********** 重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许...
  • C++多态技术的实现和反思 C++多态技术的实现和反思
  • 文章目录前言关于多态函数承载方式虚函数方式 前言 需要深入了解C/C++语言的基础之上再看此文章。...这是通过函数重载的方式实现多态,这种实现方式是静态的多态,因为在编译阶段就已经知道了的。
  • 多态实现的三个条件  有继承、有virtual重写、有父类指针(引用)指向子类对象。 多态的C++实现  virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际...
  • C++ 多态 以及实现多态的三种方式

    千次阅读 2014-09-02 21:59:06
    3. C++实现多态方式... 1 4. 细说用函数重载实现多态... 2 5. 细说用模板函数实现多态... 3 6. 小结... 4 7. 细说用虚函数实现多态... 4 7.1. 虚函数是怎么回事...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,974
精华内容 35,189
关键字:

c++多态的实现方式

c++ 订阅