面向对象语言的三大特性:继承、封装、多态
其中多态的含义是同一方法的具体执行与实际调用者上下文环境密切有关。
绑定是函数调用者与具体函数入口的关联,即如何定位到函数的执行地址
- 静态绑定:也称为编译期绑定,在程序没有运行前,就可将函数调用与具体执行代码关联
- 动态绑定:在实际运行期,判断引用对象的实际调用的方法
静态多态与动态多态
- 静态多态:主要通过重载与模板实现,其在编译期就可以确定实际的调用地址
- 动态多态:主要依靠虚函数来实现,不同的编译器其虚函数实现原理不同
虚函数的基本使用方法:
在基类的成员函数前方加virtual关键字,即该函数为虚函数,派生类重写该函数默认也为虚函数
首先查看不加virtual关键字,派生类重写基类成员函数的情况。
class Worker {
public:
virtual ~Worker() {}
void DoMyWork() {
cout << "Base" << endl;
}
};
class PMer :public Worker {
public:
void DoMyWork() {
cout << "ChildPMer" << endl;
}
};
class RDer :public Worker {
public:
void DoMyWork() {
cout << "ChildRDer" << endl;
}
};
int main() {
//使用基类指针访问派生类
Worker* ptr_pm = new PMer();
Worker* ptr_rd = new RDer();
cout << "#### use ptr #####" << endl;
ptr_pm->DoMyWork();
ptr_rd->DoMyWork();
ptr_pm->Worker::DoMyWork();
cout << "-----------------------------" << endl;
//使用基类引用访问派生类
PMer pmins;
RDer rdins;
Worker& ref_pm = pmins;
Worker& ref_rd = rdins;
cout << "#### use ref #####" <&