0. 说明:
-
函数调用的本质——通过函数名和参数调用
-
对于类对象中函数的使用,由于对象的地址作为一个参数而传递进其内部的成员函数中,故而自带this指针
-
父类指针可以指向子类对象,但是只能访问子类继承自父类的成员
-
子类重写父类的虚函数,实际上是重写了父类中虚函数表中某个成员函数的地址
-
如果父类存在虚函数,那么建议析构函数声明为虚析构
1. 多态:
(函数多态相当于函数重载)
实现方式: 在父类成员函数前加关键字 virtual
说明:
-
在父类函数加关键字virtual后,父类指针可以调用子类重写函数,
-
(子类如果重写的只是父类的普通成员函数,那么父类指针只能调用父类成员函数)
2. 虚函数表
- 在父类函数加关键字virtual后,父类指针优先调用子类重写的虚函数
3. 虚基类
由于虚函数的目的是子类重写虚函数,因此父类中虚函数可以不实现
纯虚函数: 在虚函数后面写 =0
eg: virtual void fun()=0;
说明:
- 如果一个类中拥有纯虚函数,那么该类称为虚基类
- 虚基类没法定义对象,但是可以定义指针或引用
- 可以派生新的类
- 子类实现纯虚函数才可以定义对象
4. 动态联编
静态联编:在运行之间就知道用什么函数运行
(调用速度比较快,但是不灵活)
动态联编: 调用的时候才知道使用哪个函数
(根据函数指针,找到函数进行调用,但是速度不快)
5.代码实例1
.h 文件
#pragma once
class shape
{
public:
shape();
~shape();
virtual float getSquare() = 0;
};
class circle :public shape
{
private:
float r