CPP学习备忘[9] 多态

来源:互联网 发布:nginx 多server配置 编辑:程序博客网 时间:2024/06/05 17:05
 

【1】虽然从广义上说,数据类型是数据结构在一定的编程语言中的描述形式,但实际上描述群体数据(容器)的抽象数据类型才是数据结构的真正体现。

 

【2】类定义不占用任何内存空间,也没有任何对象的预处理,所以没有任何操作上的开销。

 

【1】一个操作随着所传递或捆绑的对象类型的不同能够做出不同的反应,其行为模式称为多态。

    C++中采用一种滞后绑定技术来支持多态性,即滞后到运行时,根据具体类型的对象来捆绑成员函数。

 

【2】在C++中基类与派生类的同名操作,只要标记上virtual,则该操作便具有多态性。一旦标记基类的函数为虚函数,便有连锁反应,后面继承的类中一切同名成员函数都变成了虚函数。子类中的同名函数无需再用virtual进行声明。

用了虚函数的类,其对象的空间比不用虚函数的类多了一个指针的空间,用来指向虚函数列表,这会有一些效率影响。

   

【3】仅仅对于对象的指针和引用的间接访问才会发生多态现象。

    静态成员函数不能是虚函数。

    内联函数不能是虚函数。

    析构函数可以是虚函数且通常声明为虚函数。

    构造函数不能是虚函数。

 

【4】虚函数用于继承结构层次中的基类与子类。除了基类与子类的函数名必须相同外,连参数类型、个数和顺序都要相同,也就是说,基类和子类的虚函数不能只是名字重载。否则,成员函数即使标记上virtual,也不会被编译器做滞后处理。

   

【5】多态还可以扩展到每个对象可以动态地被识别,从而区分类型做只有该类型才能有的操作,而不是虚函数规定的操作,这样依赖于类型的动态转换;

    dynamic_cast操作是专门针对有虚函数的继承结构来的,它将基类指针转换成想要的子类指针,以做子类操作的准备。dynamic_cas操作所针对的基类指针,如果所指向的对象中不含有想要的子类对象,则将得到0.

    相对动态类型转换,静态类型转换则做范围更广的转换,但前提必须是相关的类型,也就是说,编译器必须认为可理解。Static_cast转换并不是专门针对指针的,只要是相关类型的转换,都可以操作。无非它主要是针对确定的类型,而不是针对多态。

    从type类型转换到const type类型是允许的,但是原来是const type类型的,拒绝转换到type。这时可以使用开禁操作:const_cast<char*>,也就是去掉常量性的转换操作。

 

原创粉丝点击