动态多态与静态多态
概述
- 动态多态(动态绑定):即运行时的多态,在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法,在发生继承中,对父类中的带有virtual修饰的函数进行重写,类似于Java中的接口。
- 静态多态:也称为编译期间的多态,编译器在编译期间完成的,在发生继承中,对父类的同名函数进行重定义(虚函数除外),重定义只用函数名相同即可,其他均可不同,就会将父类的同名函数屏蔽,这个时候想要访问父类的同名函数的话,需要加上作用域。静态多态实现方式:
- 函数重载:包括普通函数的重载和成员函数的重载
- 函数模板的使用
案例讲解
动态多态
学习代码
#include<iostream> using namespace std; class A { public: A(){ } virtual ~A(){ cout << "A discontruct" << endl; } virtual string OnPaint() = 0; // 定义接口 }; class B : public A { public: virtual string OnPaint() { cout<< "B" << endl; return "B"; } virtual ~B(){ cout << "B discontruct" << endl; } }; class C : public A { public: virtual string OnPaint() { cout<< "C" << endl; return "C"; } virtual ~C(){ cout << "C discontruct" << endl; } }; int main() { A* p = new B(); p->OnPaint(); // B delete p; p = new C(); p->OnPaint(); // C delete p; return 0; }
运行结果
静态多态
学习代码
- 使用模板
// 交换两个值,但是不清楚是int 还是 double,如果不使用模板,则要写两份代码 // 使用函数模板,将类型作为参数传递 template<class T> class Swa(T a,T b) { T temp; temp = a; a = b; b = temp; };
- 继承关系
#include<iostream> using namespace std; class A { public: A(){ } ~A(){ } void OnPaint(){ cout << "A" << endl; } }; class B : public A { public: string OnPaint() { cout<< "B" << endl; return "B"; } }; class C : public A { public: string OnPaint() { cout<< "C" << endl; return "C"; } }; int main() { // 静态多态的函数返回值等等都可以改变 A* p = new B(); p->OnPaint(); // A delete p; p = new C(); p->OnPaint(); // A delete p; return 0; }
运行结果