多态性

1、多态性是指发出同样的消息被不同类型的对象接收时导致完全不同的行为。

多态的实现:函数重载  运算符重载 (静态,编译时的多态)   虚函数(动态:运行时的多态)

联编(binding):是指计算机程序自身彼此关联的过程,联编工作在编译连接阶段完成的情况称为:静态联编;联编在程序运行阶段完成的情况称为:动态联编。

2、运算符重载

是对已有的运算符赋予多重含义,因C++中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)。
    a、其实现机制:将指定的运算表达式转化为对运算符函数的调用运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则,即参数类型或个数不同。

    b、可以重载C++中除下列运算符外的所有运算符: .   .*   ::   ?:     只能重载C++语言中已有的运算符,不可臆造新的;不改变原运算符的优先级和结合性;不能改变操作数个数;经重载的运算符,其操作数中至少应该有一个是自定义类型。
    c、两种形式:重载为类成员函数和重载为友元函数。

重载为类成员函数:

==》函数类型  operator 运算符(形参){......}
      重载为类成员函数时  参数个数=原操作数个数-1 (后置++、--除外),其中一个操作数为调用者。
      重载为友元函数时  参数个数=原操作数个数,且至少应该有一个自定义类型的形参。

==》双目运算符 B
如果要重载 B 为类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 为A 类对象,则 B 应被重载为 A 类的成员函数,形参类型应该是 oprd2 所属的类型。
经重载后,表达式 oprd1 B oprd2 相当于 oprd1.operator B(oprd2)

complex complex:: operator +(complex c2) //重载函数实现
{
 complex c;
 c.real=c2.real+real;
 c.imag=c2.imag+imag;
 return complex(c.real,c.imag);
}

==》前置单目运算符 U
如果要重载 U 为类成员函数,使之能够实现表达式 U oprd,其中 oprd 为A类对象,则 U 应被重载为 A 类的成员函数,无形参。
经重载后, 表达式 U oprd 相当于
oprd.operator U( )

==》后置单目运算符 ++和--
如果要重载 ++或--为类成员函数,使之能够实现表达式  oprd++ 或 oprd-- ,其中 oprd 为A类对象,则 ++或--  应被重载为 A 类的成员函数,且具有一个 int 类型形参。
经重载后,表达式  oprd++ 相当于 
oprd.operator ++(0)

重载为友元函数:

        如果需要重载一个运算符,使之能够用于操作某类对象的私有成员,可以此将运算符重载为该类的友元函数。函数的形参代表依自左至右次序排列的各操作数。
后置单目运算符 ++和--的重载函数,形参列表中要增加一个int,但不必写形参名。

==>双目运算符 B重载后, 表达式oprd1 B oprd2 等同于operator B(oprd1,oprd2 )
==>前置单目运算符 B重载后, 表达式 B oprd 等同于operator B(oprd )
==>后置单目运算符 ++和--重载后, 表达式 oprd B 等同于operator B(oprd,0 )

3、静态联编与动态联编

     联编:程序自身彼此关联的过程,确定程序中的操作调用与执行该操作的代码间的关系。
     静态联编(静态束定):联编工作出现在编译阶段,用对象名或者类名来限定要调用的函数。
     动态联编:联编工作在程序运行时执行,在程序运行时才确定将要调用的函数。
4、虚函数

    a、虚函数是动态联编的基础,是非静态的成员函数。在类的声明中,在函数原型之前写virtual;virtual 只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。
    b、本质:不是重载声明而是覆盖
    c、调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数

5、抽象类

带有纯虚函数的类称为抽象类:
class  类名
 {
     virtual 类型 函数名(参数表)=0;  //纯虚函数
}
 (1)作用:抽象类为抽象和设计的目的而建立,将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为;对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现。

 (2)抽象类只能作为基类来使用,不能声明抽象类的对象。
 (3)一个函数一旦被说明为虚函数,则无论说明它的类被继承了多少层,在每一层派生类中该函数都保持virtual特性。因此,在派生类中重新定义该函数时,不再需要关键字virtual。

 (4)虚函数的限制:

    a、只有类的成员函数才能说明为虚函数,因为虚函数仅适用于继承关系的类对象,所以普通函数不能说 明为虚函数。
    b、内联函数不能是虚函数,因为内联函数是在编译时决 定其位置。
    c、构造函数不能是虚函数,因为构造时对象还是一片未 定型的 空间。
    d、析构函数可以是虚函数,而且通常声明为虚函数。

    e、当在基类中把成员函数定义为虚函数后,在 其派生类中定义的虚函数必须与基类中的虚  函数同名,参数的类型、顺序、个数必须一一对应。

    d、实现这种动态的多态性,必须使用基类类型  的指针变量或引用,使该指针指向不同的派生类的  对象,并通过调用指针所指的虚函数才能实现动态的多态性。

 



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值