C++备考(七)多态性

学习没有捷径,但考试有捷径

临近考试,虽然之前对一些概念搞清楚了,但时日一长,很多又模糊了。因此利用整理成章,将知识重拾。
考试的范围如下:

  1. 常量(const、符号、字符串常量、立即数)
  2. 引用和指针
  3. 类的封装和隐藏(静态成员、友元函数)
  4. 类的初始化(初始化方式和顺序)
  5. 类的继承(继承方式、构函列表、多继承)
  6. 类的多态性(函数重载、运算符重载、虚函数、虚函数表)
  7. 类的作用域概念

多态性

  • 运算符重载
  • 函数名重载
  • 虚函数

运算符重载

规则

  1. 不可创造新的运算符
  2. 不可修改基本数据类型的运算符操作
  3. 不可重载的运算符
    * :: . ? :

一个疑惑

实现极坐标形式复数的表示时,疑惑:
如何重载乘法符号*

答案:可以重载,仅*做为取内容运算符时不能重载

函数名重载

避免二义性问题

void fun(void);
void fun(int a = 6);

不可同时使用,最好使用参数默认方式

子类型

公有继承时,派生类是基类的子类型
派生类的对象可以做为基类的对象进行处理,需要基类对象的任何地方都可以使用公有派生类的对象来代替,可以使用相同的函数统一处理。

关系可以传递,但不可逆

可以将派生类赋值给基类

指针

一个指向基类的指针可以指向任何公有派生类的对象

虚函数

将基类函数(成员函数,除构造函数)指定为虚函数

virtual void printStandard();

则派生类可对其进行重新定义,若不修改则沿用基类函数
必须完全一致

函数形参为基类引用或指针,实参传入派生类对象,若调用函数为虚函数则可调用派生类对应的函数。
但仅在派生类中重新定义只能调用基类函数。

  • 派生类中重定义结果
  • 派生类对象访问派生类函数,基类对象访问基类函数,不会重载
  • 派生类函数调用基类同名函数加基类作用域

虚函数表(virtual function table)

  • 每个虚函数的类有一个虚函数表
  • 虚函数表包括此类调用的函数指针
  • 每个对象含指针指向对应的虚函数表
  • 调用虚函数时,通过对象的指针找到对应调用函数

纯虚函数

基类需要靠派生类提供各个具体实现版本
基类为抽象类,可传递

virtual void printStandard()=0

可以在声明为虚函数的同时,提供实现版本
不得声明纯虚函数为内联函数

虚析构函数

  • 一个基类指定为虚析构函数,则继承的派生类都为虚析构函数
  • 当某层的虚析构函数执行后,自动调用直接基类的虚析构函数
发布了30 篇原创文章 · 获赞 2 · 访问量 780

猜你喜欢

转载自blog.csdn.net/cascara/article/details/103090730