多态是C++面向对象三大特性之一
多态分为两类
- 静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
- 动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
- 静态多态的函数地址早绑定 - 编译阶段确定函数地址
- 动态多态的函数地址晚绑定 - 运行阶段确定函数地址
non-virtual函数:你不希望derived class重新定义(override)它。
virtual函数:你希望derived class重新定义它,况且你对它有默认定义
//多态优点:代码组织结构清晰,可读性强,利于前期和后期的扩展以及维护
#include<iostream>
using namespace std;
class cDocument {
public:
void OnFileOpen() {
//这是一个算法,每个cout输出代表一个实际动作
cout << "dialog..." << endl;
cout << "check file status..." << endl;
cout << "open file..." << endl;
Serize();
cout << "close file..." << endl;
cout << "update all views..." << endl;
}
virtual void Serize() {};
};
class CMyDoc :public cDocument {
public:
virtual void Serize() {
cout << "cMDoc::Serize()" << endl;
}
};
int main() {
CMyDoc myDoc;
myDoc.OnFileOpen();
}
在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容。因此可以将虚函数改为纯虚函数
pure virtual 函数:你希望 derived class 一定要重新定义(override 覆盖它),你对它没有默认定义。
纯虚函数语法:virtual 返回值类型 函数名 (参数列表)= 0 ;
当类中有了纯虚函数,这个类也称为抽象类
class Base
{
public:
//纯虚函数
//类中只要有一个纯虚函数就称为抽象类
//抽象类无法实例化对象
//子类必须重写父类中的纯虚函数,否则也属于抽象类
virtual void func() = 0;
};
class Son :public Base
{
public:
virtual void func()
{
cout << "func调用" << endl;
};
};
void test01()
{
Base * base = NULL;
//base = new Base; // 错误,抽象类无法实例化对象
base = new Son;
base->func();
delete base;//记得销毁
}
int main() {
test01();
system("pause");
return 0;
}
抽象类特点:
- 无法实例化对象
- 子类必须重写抽象类中的纯虚函数,否则也属于抽象类