继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

C++编程第六章——多态性

荷包蛋8
关注TA
已关注
手记 1
粉丝 8
获赞 15
6.1多态的两种类型
  1. 静态联编(静态多态性或编译时的多态性)

  2. 动态联编(动态多态性或运行时的多态性)
图片描述
6.2静态多态性的实现

1.无论是非类成员的普通函数重载还是类成员函数的重载,一般都要求形参在个数、类型、顺序的一个或多个当面有所区别。

2.
图片描述

3.名字空间std不支持友元形式的重载

4.函数重载运算符一般格式为:

<函数类型> operator <运算符>(<形式参数表>){
//函数体
}

(1)重载单目运算符形式:

<函数类型> operator <运算符>(){
//函数体
}

(2)重载双目运算符形式:

<函数类型> operator <运算符>(第二操作数形式参数){
//函数体
}

5.赋值运算"="只能被重载为成员函数,并且不能被继承

6.C++允许以友元函数的形式重载输入运算符">>"和输出运算符"<<",以方便地实现用户自定义类型数据的输入和输出

(1)重载输入运算符">>"定义格式如下:

istream & operator >> (istream &in , 用户类类型 & obj){
in >> obj.item1;
in >> obj.item2;
…
return in;
}

①因为第一操作数必须是流类对象而非本类对象,所以只能以友元函数形式重载输入运算符

②函数返回输入流istream的引用,函数体返回第一个形式参数,便于用形如"cin>>对象1>>对象2;"的形式连续输入多个同类对象的值
③有两个形式参数,第一个必须为输入流istream的引用,第二个必须为本类对象的引用,不可以用值形式参数

(2)重载输出运算符"<<"的定义格式如下:

ostream & operator <<(ostream &out , const 用户类类型 & obj){
out << obj.item1;
out << obj.item2;
…
return out;
}

①因为第一操作数必须是流类对象而非本类对象,所以只能以友元函数的形式重载输出运算符

②函数返回输出流ostream的引用,函数体返回第一个形式参数,便于用形如"cout << 对象1 << 对象2;"的形式连续输出多个同类对象的值

③有两个形式参数,第一个必须为输出流ostream的引用,第二个是本类对象的引用,为保护对应实参和提高效率,一般用常引用参数

7.运算符重载不能改变运算符本身的功能和意义

6.3动态多态性的实现

1.虚函数必须是类的非静态成员函数,在类体内声明,函数原型声明方式如下:

virtual <返回类型> <成员函数名> (形式参数表);

(1)虚函数实现部分可以在类体内,也可以在类体外,在类体外定义时前面不能再加 virtual

(2)虚函数可以通过基类指针或引用访问派生类中声明为虚函数的同名函数

2.一旦在基类中指定某成员函数为虚函数,那么,不管在公有派生类中是否给出 virtual 声明,派生类(甚至是派生类的派生类…)中重新定义的原型一样的成员函数均自动为虚函数。

3.派生类必须以公有的方式继承基类,这是赋值兼容规则的使用前提,派生类只有从基类公有继承,才允许基类的指针指向派生类对象,基类的引用才允许是派生类对象的别名

4.静态成员函数、内联成员函数、构造函数不能是虚函数

5.当派生类中存在指针数据成员,又通过该指针进行了动态空间申请时,将析构函数声明为虚函数是非常有必要的

6.虚函数与同名覆盖
图片描述

7.纯虚函数只给出函数原型声明,而没有具体的实现内容,声明是在纯虚函数原型的后面赋0,其函数原型声明一般形式如下:

virtual <返回类型> <成员函数名> (<形式参数表>) =0;

(1)通常是在一个基类中定义纯虚函数,在该基类的所有派生类中都应该重新定义该函数(保持函数原型完全一样),给出特定的实现代码

(2)纯虚函数是一种没有函数体的特殊虚函数,在定义时。将 "=0" 写在虚函数原型最后,表示这是一个纯虚函数

(3)纯虚函数不能被调用,因为它只有函数名,没有具体实现代码,无法实现具体功能,只有在派生类中被具体定义后才可以调用

(4)纯虚函数的作用在于基类给派生类提供一个标准的函数原型与统一的接口,为实现动态多态性打下基础,派生类将根据需要给出纯虚函数的具体实现代码

8.抽象类指该类中至少包含了一个纯虚函数,不用于普通的基类,抽象类是类更高级的抽象,为所有的派生类提供了统一的接口

(1)抽象类不能生成对象

(2)可以定义抽象类指针或引用,用来实现动态多态性,但是,不能用抽象类作为参数类型、函数返回值类型或显示转换的类型

(3)抽象类的基类不能是普通类,抽象类是下面诸多派生类的集中归宿,如果派生类中还有纯虚函数,则该派生类还是抽象类,但是最终总会有具体类来给纯虚函数一个具体实现,才有意义

(4)抽象类除了必须至少有一个纯虚函数以外,还可以定义普通成员函数或虚函数

本章小结

图片描述

笔记同时在有道云笔记中发布。纯原创。

谢谢。

打开App,阅读手记
3人推荐
发表评论
随时随地看视频慕课网APP