多态:
在了解多态之前,我们先来了解一下对象的类型,了解对象类型就是为了更方便了解多态的类型;对象类型可以简单的分为静态类型和动态类型,其中静态类型就是对象声明的类型,在编译时确定的;而动态类型就是对象在目前的类型,是在运行时确定的;
看一下这部分的代码:
class B
{};
class C1:public B
{};
class C2:public B
{};
int main()
{
C1* pC1 = new C1;
B* pB = pC1;
C2* pC2 = new C2;
pB = pC2;
return 0;
}
其中pC1的静态类型就是C1*,动态类型也是C1*;pB的静态类型则是B*,动态类型是C1*,在被pC2赋值后此刻的动态类型就是C2*。
下面我们就来了解一下多态:
多态,简单理解就是多种形式或形态的意思,但在c++中有着更加广泛的含义。
在c++中,多态可以被分为两种,分别叫静态多态和动态多态,静态多态,我们较为熟悉的有函数重载和泛型编程(模板),函数重载在这之前已经简单的进行过介绍了,后面我会再写模板的相关内容;而动态多态主要就是虚函数,虚函数我在这里就不详细介绍了,只作一下简单的介绍。
静态多态:
以代码为例:int Add(int left, int right)
{
return left + right;
}
float Add(float left, float right)
{
return left + right;
}
int main()
{
cout << Add(10, 20) << endl;
cout << Add(12.3f, 15.6f) << endl;
return 0;
}
你看,我在其中给了两个函数,编译器会根据函数实参的类型自己判断去调用哪一个函数,如果没找到符合该类型的函数,就会编译错误。这就是静态多态。
动态多态:
就是在程序执行期间判断所用对象的类型,根据这个类型调用相应的方法,这又叫做动态绑定。
而在讲动态多态就得提到虚函数,用virtual关键字修饰类的成员函数,指明该函数为虚函数,派生类再去重新实现,这样编译器将实现动态绑定。
以代码为例:
class B
{
public:
virtual void Test1(int i)
{
cout << "B:Test1()" << endl;
}
virtual void Test2(int i)
{
cout << "B:Test2()" << endl;
}
void Test3(int i)
{
cout << "B:Test3()" << endl;
}
};
class C: public B
{
public:
virtual void Test1(int i)
{
cout << "C:Test1()" << endl;
}
void Test2(int i)
{
cout << "C:Test2()" << endl;
}
virtual void Test3(int i)
{
cout << "C:Test3()" << endl;
}
};
int main()
{
B* b = new C;
b->Test1(0);
b->Test2(0);
b->Test3(0);
return 0;
}
可以看到,这个基类类型的指针调用,在派生类重写了基类中的虚函数后,基类类型的指针就会调用派生类中的函数,而其余的则会调用相对应的函数。
注意:动态绑定有两个条件
1、必须是虚函数;
2、必须通过基类类型的指针或引用进行调用。
注:所有代码都是在vs2013下编译的。