C++学习笔记(四)

来源:互联网 发布:spss mac下载官网 编辑:程序博客网 时间:2024/06/14 07:12

多态性与虚函数

运算符重载:

重载成类成员函数:<返回类型>  <类名>::operator <op>(<类型> 参数){…}

由于有this指针,故单目运算符不带参数,双目运算符带一个参数。

 

声明为友元函数:friend<返回类型> operator <op>(参数,参数){}

 

规则:通常单目运算符最好重载为成员函数,双目运算符最好重载为友元函数。

     不能新定义运算符,不能改变运算符的优先级与运算量个数…

 

重载=:

1.必须重载为非静态成员函数,可确保赋值目标运算量(左值)始终是一个对象。

2.为实现多重赋值,重载函数返回值定义为目标对象的类型。即返回到对象(实际中采用返回对象的引用)。

3.由于是赋值,对任何类,没有提供重载运算符函数时,C++自动提供一个默认赋值运算符函数。(不提供分配空间的功能),为此在此需求时,应提供重载运算符函数。

 

重载增量,减量运算符:

++a:<返回类型&>  <类名>::operator<op>( )

{…}

a++: <返回类型>  <类名>::operator<op>(int ) =  a++(0)//看成双目的

{…}

 

重载():多目运算符,适用多个运算符的情况

  A(1,1)等价于a.operator()(1,2),注意返回值

 

重载[ ]:双目运算符,只能声明为非静态成员函数,不能是友元函数。

 

虚函数:

静态编联:在编译时,编译系统根据对象就能决定调用固定的函数体代码段。(支持c++运算符重载与函数名重载的多态性)

动态编联:(virtual)采用虚函数实现多态,运行时,将函数的形式参数与函数的不同版本动态的进行匹配的编联过程,必须将指向基类的指针访问虚函数。

与重载成员函数不同:必须保证参数完全一致,重载成员函数则确保参数个数不同,or至少一个参数的类型不同。

基类中声明成员函数为虚函数,则所有派生类仍是虚函数。

 

实现机制:c++为每个至少拥有一个虚函数的类建立起一个与之有关的虚函数表VFT,一系列函数指针,一个类只有一个VFT,由所有对象共享,自动生成,函数指针隐含。

先找到本类的vptr指针,进入VFT,根据本类的VFT表来确定指向的成员函数入口地址(实际上感觉就是在编译的时候做了点手脚)。

 

纯虚函数:

Class XX{

virtual <类型> 纯虚函数名(参数表) = 0;

};

1.      派生类中必须定义其实现版本,否则,将产生编译错误。

含有纯虚函数的类,成为抽象类:用来描述一般抽象概念性的东西,只能做基类,不能为它创建对象

0 0
原创粉丝点击