c++ 多态 运行时多态和编译时多态_码农子与多态的日常

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第1张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第2张图片 -码农子的日常-

______

  那么,到底什么是多态呢?

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第3张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第4张图片

  Sorry放错图了(雾

       事实上,多态,而非堕胎or多肽,是c++非常常见的一个名词。

      抽象定义:一个函数名关联多种含义的能力。(by Walter Savitch)

      详细定义:允许将父类对象设置成为和一个或更多的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。(by Charlie Calverts)

      超详细定义:我们在程序中定义的引用变量所指向的具体类型和通过该引用变量的方法调用在编程的时候并不确定,当处于运行期间才确定。就是这个引用变量究竟指向哪一个实例对象,在编译期间是不确定的,只有运行期才能确定,这样不用修改源码就可以把变量绑定到不同的类实例上,让程序拥有了多个运行状态,这就是多态。

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第5张图片

      Why多态:需要这样一种机制:合而不同。即在编写代码时将各种子类对象按照相同类型来处理,以简化代码;而在运行时,分别绑定到各自不同的实现函数。

举例:比如你家有亲属结婚了,让你们家派个人来参加婚礼,邀请函写的是让你爸来,但是实际上你去了,或者你妹妹去了,这都是可以的,因为你们代表的是你爸,但是在你们去之前他们也不知道谁会去,只知道是你们家的人。可能是你爸爸,可能是你们家的其他人代表你爸参加。

      实现多态:C++中,实现多态有以下方法:编译时的多态、运行时的多态。接下来要介绍的是用模板来实现编译时的多态。

█████模板

      What:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码,模板是创建泛型类或函数的蓝图或公式。(这谁看得懂QAQ)

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第6张图片

Why:

Example(函数模板):

请完成函数swapValues:

用来交换以下类型的两个变量的数值:

int

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第7张图片

请完成函数swapValues:

用来交换以下类型的两个变量的数值:

double、char

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第8张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第9张图片

请完成函数swapValues:

用来交换以下类型的两个变量的数值:

long int、long long int、unsigned int、unsigned long int……

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第10张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第11张图片

      为了提高重复定义的效率,C++提供了模板方法,允许将类型名称作为参数的函数和类。这样的函数能使用不同类型的参数,而且能定义泛型类。

具体操作:

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第12张图片

注:template称为模板前缀,它告诉编译器后续的定义或函数声明是模板,T是类型参数。在上下文中,class一词实际的意思是type。当然,类型参数T可以替换成任意类型,无论该类型是不是类。在函数体中,类型参数T的用法和其他任何类型没有区别。

总之,上述模板实现了以下操作:

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第13张图片 小黑板时间到!! c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第14张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第15张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第16张图片

      函数模板使得函数定义更加泛化,而类模板使得类的定义更泛化。

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第17张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第18张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第19张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第20张图片

--码农子的日常--

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第21张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第22张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第23张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第24张图片

类定义和成员函数的定义要用以下代码开头:

template

然后,类和成员函数的定义和其他任何普通类没有区别,只是可用Tpye_Parameter代替类型。

例如,下面是一个类模板定义的开头

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第25张图片

      之后,成员函数和重载操作符可定义成员函数模板。例如,针对上述类模板,setElement函数在类外定义可像下面这样开头:

1ccd7262088787c9ca8230f4db622110.png

      定义好类模板之后,就可声明该类的对象。声明必须指定要为T填充声明类型。例如:

5de59eaeb2782010668b3936184cb423.png c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第26张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第27张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第28张图片 c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第29张图片

3、总结

l  使用函数模板,可定义获取类型参数的函数。

l  使用类模板,可贯穿整个类使用类型参数。

PS:《C++程序设计语言》比《C程序设计语言》厚了几倍...果然有了对象就麻烦很多。(雾

██████

c++ 多态 运行时多态和编译时多态_码农子与多态的日常_第30张图片

你可能感兴趣的:(c++,多态,运行时多态和编译时多态)