我对多态的的理解以及重载和重写

同一种语句有多重形态,在不同的类型中,有不同的属性和表现方法;

多态原理;多态的是函授指针

多态的实现效果

多态:同样的调用语句有多种不同的表现形态;

多态实现的三个条件 

有继承、有virtual重写、有父类指针(引用)指向子类对象。

多态的C++实现

virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是要根据指针所指向的实际对象类型来判断如何调用

多态的理论基础 

动态联编PK静态联编。根据实际的对象类型来判断重写函数的调用。

多态的重要意义 

设计模式的基础。

实现多态的理论基础 

函数指针做函数参数


C++中多态的实现原理

当类中声明虚函数时,编译器会在类中生成一个虚函数表

虚函数表是一个存储类成员函数指针的数据结构

虚函数表是由编译器自动生成与维护的

virtual成员函数会被编译器放入虚函数表中

存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)




说明1:

通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。

说明2:

出于效率考虑,没有必要将所有成员函数都声明为虚函数

2、构造函数中能调用虚函数,实现多态吗?why?


1)对象中的VPTR指针什么时候被初始化?

 

对象在创建的时,由编译器对VPTR指针进行初始化

只有当对象的构造完全结束后VPTR的指向才最终确定

父类对象的VPTR指向父类虚函数表

子类对象的VPTR指向子类虚函数表


2)分析过程

画图分析

3)结论:构造函数中调用多态函数,不能实现多态。


4)如何证明vptr指针的存在哪?

30. 函数重载是什么意思?它与虚函数的概念有什么区别?

答:函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数、参数类型不同,函数的返回值来区分该调用哪一个函

数,即实现的是静态的多态性。但是记住:不能仅仅通过函数返回值不同来实现函数重载。而虚函数实现的是在基类中通过使用关键字virtual

来申明一个函数为虚函数,含义就是该函数的功能可能在将来的派生类中定义或者在基类的基础之上进行扩展,系统只能在运行阶段才能动态

决定该调用哪一个函数,所以实现的是动态的多态性。它体现的是一个纵向的概念,也即在基类和派生类间实现。

45. 虚拟函数与普通成员函数的区别?内联函数和构造函数能否为虚拟函数?

答案:区别:虚拟函数有virtual关键字,有虚拟指针和虚函数表,虚拟指针就是虚拟函数的接口,而普通成员函数没有。内联函数和构造函数不能为虚拟函数。

46. 构造函数和析构函数的调用顺序? 析构函数为什么要虚拟?

答案:构造函数的调用顺序:基类构造函数—对象成员构造函数—派生类构造函数;析构函数的调用顺序与构造函数相反。析构函数虚拟是为了防止析构不彻底,造成内存的泄漏。

127.类成员函数的重载、覆盖和隐藏的区别

答案:

成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual 关键字可有可无。

覆盖是指派生类函数覆盖基类函数,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual 关键字。

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)

重写PK 重载理解

函数重载

必须在同一个类中进行

子类无法重载父类的函数,父类同名函数将名称覆盖

重载是在编译期间根据参数类型和个数决定函数调用

函数重写

必须发生于父类与子类之间

并且父类与子类中得函数必须有完全相同的原型

使用virtual使命之后能够产生多态,如果不适用virtual,那就重定义

多态是运行期间根据具体对象的类型决定函数调用

时间: 2024-10-10 23:10:26

我对多态的的理解以及重载和重写的相关文章

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定

1.成员变量的继承 1.1要点 子类用extends关键字继承父类.子类中可以提供新的方法覆盖父类中的方法.子类中的方法不能直接访问父类中的私有域,子类可以用super关键字调用父类中的方法.在子类中可以增加域,增加方法或者覆盖超类的方法,然而绝对不能删除继承的任何域和方法. 在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性

[转]Java中继承、多态、重载和重写介绍

什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承.多态.重载和重写. 继承(inheritance) 简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型.继承是面向对象的三个基本特征--封装.继承.多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类.超类),如果

我理解多态性与重载和重写

同一种语句有多重形态.在不同的类型中,有不同的属性和表现方法. 多态原理.多态的是函授指针 多态的实现效果 多态:相同的调用语句有多种不同的表现形态: 多态实现的三个条件  有继承.有virtual重写.有父类指针(引用)指向子类对象. 多态的C++实现 virtualkeyword.告诉编译器这个函数要支持多态:不要依据指针类型推断怎样调用:而是要依据指针所指向的实际对象类型来推断怎样调用 多态的理论基础  动态联编PK静态联编.依据实际的对象类型来推断重写函数的调用. 多态的重要意义  设计

C#中多态、重载、重写区别分析

本文实例总结了C#中多态.重载与重写的概念与区别.对于初学C#的朋友来说有不错的参考价值.分享给大家供大家参考.具体分析如下: 重写 : 是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override . 格式如下: 1.在基类中: public virtual void myMethod() { } 2.在子类中: public override void myMethod() { } 重写以后,用基类对象和子类对象访问myMethod()方法,结果都是

多态的深入理解

对于Java的多态概念的理解 在学习Java的过程中,我们无论如何也绕不过多态这个东西.它到底是个什么东西呢? 其实,它就是指调用相同名字的方法,但是得到的结果是不同的. 第一: 对象是方法 多态的作用范围是方法,不是类不是对象,也不是对象里面的属性 第二: 多态产生的条件 1.有继承---在子类中有方法重写---在方法的调用中,有指向子类的父类的引用 2.有方法的重载,就是相同方法名,但参数不同(个数,类型,顺序) 第三:为什么需要多态? 因为真实世界中的情况是纷繁复杂的,为了应对生活中的种种

Java基础:多态(重载和重写)

(1)域与静态方法 记住"只有普通方法的调用是多态的". 而域和静态方法不是:对于域的访问,在编译期间就已经进行解析和绑定了.而如果某个方法是静态的,就不具备多态性. (2)编写构造器有一条准则: * 用尽可能简单的方法使得对象进入正常状态,尽量避免调用其他方法. * 构造器内能够安全调用的方法只有那些final方法(private默认final),因为他们无法被覆盖. (3)多态概念: 多态是指一个程序中同名的不同方法共存的情况. 这些方法同名的原因是它们的最终功能和目的都相同,但是

多态,重载,重写

override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法.重写(覆盖)的规则: 1.重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2.重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private). 3.重写的方法的返回值必须和被重写的方法的返回一致: 4.重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类: 5.被重写

C++ 类的多态二(函数重载--函数重写--函数重定义)

//函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子类无法重载父类的函数,父类同名函数将被子类的同名函数覆盖 重载是在编译期间根据参数类型,顺序,个数决定的函数调用 函数重写 必须发生于父类和子类之间 并且父类和子类中的函数必须有完全相同的函数签名 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类

重载,重写,多态例子

重载 方法重载是让类以统一的方式处理不同类型数据的一种手段.Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法. package com.wzs; /** * 重载 * * @author Administrator * */ public class OverLoadTest { public int add(int a, int b) { return a + b; } pub