精华内容
下载资源
问答
  • 动态多态

    2010-11-16 10:33:29
    c++面对对象的精髓-动态多态。  有动态就有静态,静态是在编译期完成的,如一个类里面有相同名字,返回值的函数,通过不同的参数来区分。(overload)  动态多态,函数用virtual修饰。在子类中override父类的函数...

      c++面对对象的精髓-动态多态。

      有动态就有静态,静态是在编译期完成的,如一个类里面有相同名字,返回值的函数,通过不同的参数来区分。(overload)

      动态多态,函数用virtual修饰。在子类中override父类的函数funcA,然后再调用这个子类对象的funcA,那当然是调用这个子类对象的funcA,但是如果用父类指针指向这个子类呢? 如:father *fa_pointer = &son;fa_pointer->funcA(),这样就是调用父类中的funcA,如果funcA加了virtual修饰呢?奇迹就发生了,将调用子类中的funcA,这就是动态多态,在运行期才能确定的,也称晚绑定。

    展开全文
  • 多态分为静态多态和动态多态。 1.静态多态: 静态多态又称编译期多态:是指在**编译阶段就知道程序执行到这里接下来会执行哪个函数。**例如:函数重载,对象名加点操作符执行函数等都是静态多态。函数重载是函数名...

    多态:即多种形态。对不同对象发送同一消息,不同对象会做出不同的响应。多态分为静态多态和动态多态。
    1.静态多态:
    静态多态又称编译期多态:是指在**编译阶段就知道程序执行到这里接下来会执行哪个函数。**例如:函数重载,对象名加点操作符执行函数等都是静态多态。函数重载是函数名修饰规则从而确定执行哪个函数,而对象名加点操作符是通过this指针来确定的。
    2.动态多态:
    动态多态是利用虚函数实现运行时的多态,即在编译期并不知道接下来执行哪条语句,只有运行到这里才知道接下来要调用哪个函数。
    实现动态多态的条件:
    1.函数在基类中声明为虚函数,并且在派生类中重写;
    2.对象的父类指针或引用,如果对象指向子类(子类对象的引用/指针赋给基类对象引用/指针),则调子类的虚函数;如果对象指向父类对象,则调父类的虚函数。

    class A
    {
    public:
    	virtual void func1()
    	{
    		cout << "A::func1()" << endl;
    	}
    	void display()
    	{
    		cout << "A::display()" << endl;
    	}
    	void display(int i)
    	{
    		cout << "A::display(int i)" << endl;
    	}
    protected:
    	int _a;
    };
    
    class B : public A
    {
    public:
    	virtual void func1()
    	{
    		cout << "B::func1()" << endl;
    	}
    protected:
    	int _b;
    };
    
    void func(A& a)
    {
    	a.func1(); //动态多态
    	a.display();  //函数重载 即静态多态
    	a.display(10);
    }
    
    
    int main()
    {
    	A a;
    	B b;
    	func(a);
    	func(b);
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • C++动态多态

    2020-10-09 16:24:23
    动态多态 动态多态的设计思想:对于多个相关的对象类型,确有一个公共继承的基类,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。 客户端的代码(操作...

    动态多态

    动态多态的设计思想:对于多个相关的对象类型,确有一个公共继承的基类,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。

    客户端的代码(操作函数)通过指向基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到实际提供的子类对象上去。

    代码:

     

    运行结果:

     

    总结

    动态多态的满足条件

    1,有继承关系

    2,子类重写父类的虚函数

    动态多态的使用

    1,父类的指针或者引用 指向子类的对象

     

    展开全文
  • C++多态——静态多态与动态多态

    万次阅读 多人点赞 2017-02-16 16:01:54
    并且多态分为静态多态和动态多态。静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函数的重载,对象名加点操作符执行成员函数等,都是静态多态,其中,重载是在形成符号表的时候,对...

    多态 : 顾名思义,多态就是多种形态,也就是对不同对象发送同一个消息,不同对象会做出不同的响应。

    并且多态分为静态多态和动态多态。

    静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函数的重载,对象名加点操作符执行成员函数等,都是静态多态,其中,重载是在形成符号表的时候,对函数名做了区分,从而确定了程序执行到这里将要执行哪个函数,对象名加点操作符执行成员函数是通过this指针来调用的。

    函数的重载比较简单,不再赘述,这里我们通过一个简单的例子来看一下对象名加点操作符执行成员函数的静态多态:

    class A
    {
    public:
    	void Set(int a)
    	{
    		_a = a;
    	}
    public:
    	int _a;
    };
    
    int main()
    {
    	A a1;
    	a1.Set(15);
    	return 0;
    }
    

    这里定义了一个A类,有一个成员函数和一个成员,我们将程序的部分汇编代码截取出来如下图:
    这里写图片描述
    我们可以看到这里直接是一个lea指令将a1对象的地址放入寄存器eax中,也就是对象的this指针,然后用call指令就可以跳转到Set函数,也就是说其汇编代码在此时就知道应该要去到哪个地方之行哪个函数,这就是静态多态,也叫编译时多态

    动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。

    在说动态多态之前我们先来看一下什么是虚函数,虚函数就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。

    下面我们通过一个例子来看一下利用虚函数实现的动态多态:

    class A
    {
    public:
    	A(int a = 10)
    		:_a(a)
    	{}
    	 virtual void Get()
    	{
    		 cout << "A:: _a=" << _a << endl;
    	}
    public:
    	int _a;
    };
    
    class B :  public A
    {
    public:
    	B(int b = 20)
    		:_b(b)
    	{}
    	void Get()
    	{
    		cout << "B:: _b=" << _b << endl;
    
    	}
    
    	int _b;
    };
    
    int main()
    {
    	A a1;
    	B b1;
    	A* ptr1 = &a1;
    	ptr1->Get();
    
    	ptr1 = &b1;
    	ptr1->Get();
    	
    	return 0;
    }
    
    

    在这里我们看到,基类A的Get函数声明为虚函数,在B类中进行了重写,
    然后在main函数中分别用基类的ptr1和指向子类的ptr2进行调用虚函数Get,我们得到了如下图的输出:
    这里写图片描述
    这说明确实是实现了不同调用,而且是在运行时,那么虚函数的底层到底是怎么实现的呢,我们来看一下汇编代码及其对象模型
    这里写图片描述
    通过上图的汇编代码,我们看到这里做了一系列的指针解引用处理,最后确定了eax中应该存放的this指针的值,要搞清楚这个必须要搞清楚子类的对象模型。
    这里写图片描述
    用监视窗口查看b1可以看到如上图所示,这里的_vfptr是一个虚表指针,它指向一个存放该类对象的所有虚函数的地址的表,我们可以将该表理解为一个函数指针数组,在该数组的最后一个元素,编译系统会将其置为0,。
    对象模型如下图示:
    这里写图片描述
    其中红色为A类的成员,黑色为B类对象b1的成员,紫色就是一个虚函数表,存放着存放该类对象的所有虚函数的地址,汇编代码做了一系列的指针解引用处理就是为了从虚函数表中找到相应的虚函数进行调用,从而实现了动态多态。

    展开全文
  • c++——动态多态

    2020-02-18 17:00:30
    c++多态分为动态多态和静态多态,静态多态就是函数承重载,运算符重载。动态多态就是派生类和虚函数之间的关系了。 首先动态多态发生的条件:有继承关系、子类中重写了父类中的虚函数 重载与重写:重载要求函数名...
  • 浅析动态多态原理

    2021-07-29 09:19:07
    多态分类及动态多态实现条件 先抛开严格的定义,所谓多态,顾名思义,就是多种形态。 多态分为两类:1.静态多态:函数重载和运算符重载 2.动态多态:派生类和虚函数实现运行时多态 动态多态实现有如下条件:1...
  • 静态多态和动态多态 静态多态 静态多态也称为编译时多态,即在编译时决定调用哪个方法; 静态多态一般是指方法重戟; 只要构成了方法重载,就可以认为形成了静态多态的条件; 静态多态与是否发生继承没有必然联系 ...
  • 静态多态和动态多态

    千次阅读 2017-03-16 16:08:57
    面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。 应用形式上: 静多态是发散式的,让相同的实现代码应用于不同的场合。 动多态是收敛式的,让不同的实现...
  • 多态分为动态多态和静态多态。 静态多态:在运行前就决定函数调用的地址,也就是地址早绑定。 静态多态包括了:函数重载,运算符重载,和重定义。 分别阐述一下: 函数重载首先在同一个作用域当中,函数的名字相同,...
  • 1.静态多态 2.动态多态
  • 动态多态、静态多态

    2020-04-18 21:28:09
    两者本质不同,静态多态在编译期决定,由模板具现完成,而动态多态在运行期决定,由继承、虚函数实现; 所谓联编就是将函数的调用和函数的定义联系起来。 分为静态联编和动态联编; 静态联编: 指在程序编译连接...
  • 静态多态与动态多态

    2019-06-24 01:28:47
    面向对象编程的多态从绑定时间来看,可以分成静态多态和动态多态,也称为编译期多态和运行期多态。 java中overload是静态多态,即根据参数列表进行最佳匹配,在编译阶段决定要具体执行哪个方法。而与之相反,overriden...
  • 动态多态以及多态调用过程

    千次阅读 2017-02-26 15:07:22
    多态分为静态多态与动态多态。静态多态包括函数重载,泛型编程。动态是虚函数的使用。  静态多态是指编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用的那个函数,...
  • C++---静态多态与动态多态

    万次阅读 多人点赞 2018-08-02 18:32:37
    动态多态 静态多态 静态多态:也称为编译期间的多态,编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。 ...
  • c++中静态多态和动态多态的区别 静态多态的函数地址早绑定,编译阶段确定函数地址 动态多态的函数地址晚绑定,运行阶段确定函数地址
  • 静态多态: 编译阶段确定函数地址 (如:函数重载) 动态多态:运行过程中确定函数地址 (子类重写父类虚函数)
  • 顾名思义,动态多态,即在运行时,也即代码执行时表现出来的多种状态。 在语法层面,是通过使用virtual标记基类的函数,然后在派生类中重写此函数。在代码执行时,通过基类指针或引用的真实派生类型来调用派生类中...
  • 静态多态与动态多态的区别

    千次阅读 2020-04-22 20:16:51
    静态多态:函数入口地址是在编译阶段确定(运算符重载,函数重载) 动态多态:函数入口地址是在运行阶段确定(虚函数)
  • 动态多态(运行期期/晚绑定) •虚函数:用 virtual 修饰成员函数,使其成为虚函数 注意: •普通函数(非类成员函数)不能是虚函数 •静态函数(static)不能是虚函数 •构造函数不能是虚函数(因为在调用构造函数...
  • 动态多态 静态多态 静态多态:也称为编译期间的多态,编译器在编译期间完成的,编译器根据函数实参的类型推断出要调用那个函数,如果有对应的函数就调用该函数,否则出现编译错误。 静态多态的两种实现方式: ...
  • C++中的多态分为两种:静态多态与动态多态 一、静态多态:也成为编译时的多态;在编译时期就已经确定要执行了的函数地址了;主要有函数重载和函数模板(这里只写函数重载) (1)函数重载 因为C++中确定执行的函数...
  • 并且多态分为静态多态和动态多态。 静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,例如:函数的重载,对象名加点操作符执行成员函数等,都是静态多态,其中,重载是在形成符号表的时候,对...
  • C++的动态多态和静态多态

    千次阅读 2013-03-12 11:20:05
    包含静态多态和动态多态 它们之间有一定的相似性 述了这种相似性 并重点论述了以模板实现的静态多态的应用范围 关键词 动态多态 静态多态 模板多态 概念 模型 标准模板库 但是应用范围不同
  • 在c++中这块基石主要是通过继承和虚函数来实现的,由于这两个机制(继承和虚函数)可能都是运行期进行处理的,因此我们把这种多态称为动态多态。模板中也存在多态机制,但是却不是动态多态,而是静态多态。模板中...
  • 多态(1)静态多态与动态多态 什么是多态 从字面上理解就是多种形态的意思。而多态一词最初源自希腊语,其含义便是“多种形式”,意思是是具有多种形式或形态的情形,在C++语言中多态有着更广泛的含义。在C++ ...
  • 动态多态的原理

    2018-04-05 12:37:37
    首先是多态的分类,分为静态多态和动态多态,也可以称为早绑定和晚绑定,区分的时刻就是程序在编译阶段根据参数个数确定调用哪个函数,如果能够确定就是早绑定如果不能确定就是晚绑定,如果要实现多态就必须要使用虚...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 117,211
精华内容 46,884
关键字:

动态多态