动态多态与静态多态
概述
- 动态多态(动态绑定):即运行时的多态,在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法,在发生继承中,对父类中的带有
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;
}
运行结果