多态:
维基百科解释:
指计算机程序运行时,相同的消息可能会送给多个不同的类别之对象,而系统可依据对象所属类别,引发对应类别的方法,而有不同的行为。
百度百科解释:
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
顾名思义,动态多态既是,在编译时决定,当程序运行时,根据调用关系,决定结果。即在编译时才决定结果。
静态多态 ,不是在编译是时决定。主要是,函数重载,模板,的运用。
重载是根据函数参数的类型,顺序,个数的不同(返回值可同可不同)来实现一个函数名有多种运行结果。模板是根据类型的推演来决定结果(泛型)。
(还有 非参数化多态或译作特设多态,参数化多态 之分,有兴趣也可以去了解一下)
C++中多态,是通过虚函数(virtual关键字修饰的函数)来实现的。
有两个类,A和B,我们让B公共继承A。 此时,我们称A为父类(基类),称B为子类(派生类)。
class A
{
public:
virtual void Fun() //virtual关键字实现虚拟函数
{
printf("A::Fun()\n");
}
};
class B : public A //子类公共继承父类
{
public:
virtual void Fun()//virtual关键字实现虚拟函数
{
printf("B::Fun()\n");
}
};
此时我们分别创建对象,然后分别用父类的指针指向 父类,和用父类的指针指向子类。
int main()
{
A a;
B b;
A* pa = &a; //父类指针指向父类
pa->Fun(); //调用父类函数 (打印出“A::Fun()”)
pa = &b; //父类指针指向子类
pa->Fun();//调用子类函数 (打印出“B::Fun()”)
)
system("pause");
return 0;
}
C语言模拟实现:
typedef void(*FUN)(); //定义一个函数指针(返回值为void,参数为空 的函数)
struct A
{
FUN f; //函数指针
};
struct B
{
A a; //通过在B类中创建A类对象达到继承的目的
};
void FunA()
{
printf("A::Fun()\n");
}
void FunB()
{
printf("B::Fun()\n");
}
int main()
{
A a;
B b;
a.f = FunA; //父类中的函数指针指向FunA
b.a.f = FunB;//子类中的函数指针指向FunB
A* pa = &a;//父类指针指向父类对象
pa->f(); //调用 父类函数 (FunA)(打印出“A::Fun()”)
pa = (A*)&b; //父类指针指向子类对象(需强转)
pa->f();//调用 子类函数(FunB)(打印出“A::Fun()”)
system("pause");
return 0;
}