[cpp特性]

124 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

多态 -运行时

在c++中,它的意思是支持相关的对象具有不同的成员函数(但原型相同),并允许对象与适当的成员函数进行运行时绑定。
c++通过覆盖(override)支持这种机制。在成员函数前面加上virtual关键字,可以告诉编译器该成员函数是多态的(也就是虚函数)
为什么成员函数不缺省的使用virtual?不管怎样,如果需要调用基类的成员函数,可以使用下面的方法:p->Fruit::peel();它的原因和c语言为什么不缺省的使用register关键字有异曲同工之处 -它是一种笨拙的优化措施。既然并不是每个成员函数调用都要这种运行时的间接形式,为什么要让每个成员函数都添加一个额外的负担呢?应该显示的告诉编译器哪些成员函数需要多态
单继承通常通过在每个对象内包含一个vptr指针来实现虚函数。vptr指针指向一个叫做vtbl的函数指针向量(称为虚函数表,也称V表)。每个类都有一个向量,勒种的每个虚函数在该向量中都有一条记录。使用这种方法,该类的所有对象可以共享实现代码。虚函数表的布局是预先设置好的,某个成员函数的指针在该类的所有子类的虚函数表中的偏移地址都是一样的。在运行时,对虚函数的调用是通过vptr指针根据适当的偏移量调用虚函数表中合适的函数指针实现的,它是一种间接调用。多重继承的情况更为复杂,需要另外一层的间接形式。如果你搞不明白,可以对它画一幅图,线的末端就是需要调用的成员函数。

泛型 -编译时多态

模板(template)
函数模板的语法:
template<typename T>
返回类型 函数名(参数列表){函数体}
函数模板的调用方式:
1.明显的调用
函数名<参数类型>(实参); -常用的
2.自动函数推导
函数名(实参)

异常(exception)

c++的这个概念源于Ada,也源于Clu(MIT所开发的一种实验性语言),它用于在错误处理时改变程序的控制流。异常通过发生错误时把处理自动切换到程序中用于处理错误的那部分代码,以简化错误处理