显式接口,运行期多态(面向对象编程解决问题的方式)
显式接口:我们知道它是什么样子,在源码中明确可见。
虚函数:提供运行期多态支持,根据动态类型决定调用函数。
模板和泛型编程的重点是隐式接口和编译期多态
看下面这个模板函数
2.由于参数T的种类可以多种多样,这样,在编译期,T的具体类型的不同导致了函数体内w所调用的函数也不相同。这便是所谓的编译期多态。
3.关于编译期多态和运行期多态
编译期多态和运行期多态可以简单的理解成,一个是决定哪个重载函数该被调用(一般依据编译器的函数重命名规则来实现,发生在编译期),另一个是哪一个虚函数该被绑定(通过虚函数表和虚函数指针实现,发生在运行期,根据类中的虚函数指针来动态确定)。
4.关于显式接口和隐式接口
显式接口就是一个完整的函数签名,明确指明了函数名称,参数类型,返回值
隐式接口由一系列有效表达式组成。什么意思呢
比如这样一个表达式:
w.size()>10&&w!=someNastWidge
通过表达式来指明类型参数T具有哪些能力,这些便是隐式接口
牢记:
1.类和模板都支持接口和多态
2.对类而言,接口是显式的(explicit)。多态是通过虚函数在运行期实现。
3.模板,接口是隐式的(implicit),是基于有效表达式的。多态是通过在编译期,模板具体化和对函数重载的解析来实现。
显式接口:我们知道它是什么样子,在源码中明确可见。
虚函数:提供运行期多态支持,根据动态类型决定调用函数。
模板和泛型编程的重点是隐式接口和编译期多态
看下面这个模板函数
-
template<typename T>
-
void
DoSometing
(T& w)
-
{
-
if(w.
size()>
10&&w!=someNastWidge)
-
{
-
T temp(w);
-
temp.
normalize();
-
temp.
swap(w);
-
}
-
}
1.函数内w所调用的函数就是一组隐式接口。单从代码上看我们还不能确定w是什么类型。但是T必须支持这些隐式接口。
2.由于参数T的种类可以多种多样,这样,在编译期,T的具体类型的不同导致了函数体内w所调用的函数也不相同。这便是所谓的编译期多态。
3.关于编译期多态和运行期多态
编译期多态和运行期多态可以简单的理解成,一个是决定哪个重载函数该被调用(一般依据编译器的函数重命名规则来实现,发生在编译期),另一个是哪一个虚函数该被绑定(通过虚函数表和虚函数指针实现,发生在运行期,根据类中的虚函数指针来动态确定)。
4.关于显式接口和隐式接口
显式接口就是一个完整的函数签名,明确指明了函数名称,参数类型,返回值
隐式接口由一系列有效表达式组成。什么意思呢
比如这样一个表达式:
w.size()>10&&w!=someNastWidge
通过表达式来指明类型参数T具有哪些能力,这些便是隐式接口
牢记:
1.类和模板都支持接口和多态
2.对类而言,接口是显式的(explicit)。多态是通过虚函数在运行期实现。
3.模板,接口是隐式的(implicit),是基于有效表达式的。多态是通过在编译期,模板具体化和对函数重载的解析来实现。