C++入门学习笔记4:多态
- Sunny
- 0
类的多态就是指多种形态,在接触多态前,我们先来认识一下虚函数。
虚函数
- 在类的定义中,前面带有
virtual
关键字的成员函数就是虚函数。 virtual
只写在类定义的函数声明中,写函数体时不用。
注意:构造函数和静态成员函数不能是虚函数。
class base{
public:
virtual int get();
...
...
};
int base::get(){
//函数体
};
虚函数与普通成员函数的区别就在于虚函数可以参与多态,而普通的成员函数不能。
多态的表现形式
表现形式一
派生类的指针可以赋值给基类指针。
如果,通过基类指针调用基类和派生类的同名虚函数,那么会出现以下两种情况:
- 指针指向基类的对象,则被调用的是基类的虚函数。
- 指针指向派生类的对象,则被调用的是派生类的虚函数。 这中机制就是多态。 示例:
#include <iostream>
using namespace std;
class CBase{
public:
virtual void SomeVirtualFunction(){
cout<<"CBase"<<endl;
}
};
class CDerived:public CBase{
public:
virtual void SomeVirtualFunction(){
cout<<"CDerived"<<endl;
}
};
int main(){
CDerived ODerived;
CBase *p=&ODerived;
p->SomeVirtualFunction(); //调用哪个虚函数取决于p指向哪种类型的对象
return 0;
}
debug后输出结果为:
CDerived
从上述程序中我们可以发现,在语句CBase *p=&ODerived;
执行时,指针p
指向派生类CDerived
的对象ODerived
,因此,调用的是ODerived
中的虚函数SomeVirtualFunction
。
表现形式二
派生类的对象可以赋值给基类的引用。
如果,通过基类引用调用基类和派生类的同名虚函数,那么会出现以下两种情况:
- 引用引用的是基类的对象,则被调用的是基类的虚函数。
- 引用引用的是派生类的对象,则被调用的是派生类的虚函数。
这中机制也称为多态。
示例:
#include <iostream>
using namespace std;
class CBase{
public:
virtual void SomeVirtualFunction(){
cout<<"CBase"<<endl;
}
};
class CDerived:public CBase{
public:
virtual void SomeVirtualFunction(){
cout<<"CDerived"<<endl;
}
};
int main(){
CDerived ODerived;
CBase & r =ODerived;
r.SomeVirtualFunction();
return 0;
}
debug后程序运行结果为:
CDerived
我们通过解析上面的程序很容易发现,基类CBase
引用了派生类CDerived
的对象ODerived
,因此调用的是ODerived
中的虚函数SomeVirtualFunction
。
多态的作用
多态是面向对象语言的一个重要的性质,可以增强程序的可扩充性,即程序修改或增加功能时,减少代码修改量。