6.1虚函数和多态
虚函数
- 在类的定义中,前面有virtual关键字的成员函数就是虚函数
class base{
virtural int get(){}
};
- virtural 关键字只用再类定义里的函数申明中,写函数体时不用
- 构造函数和静态成员函数不能是虚函数,析构函数可以是虚函数
多态
- 派生类的指针可以赋值给基类指针
- 通过基类指针调用基类和派生类中的同名虚函数的时候:
若指针指向的是一个基类的对象,则调用的是基类的虚函数
若指针指向的是一个派生类的对象,则调用的是派生类的虚函数
这种行为叫做 【多态】 - 派生类的对象可以赋值给基类引用
- 通过基类引用调用基类和派生类的同名虚函数的时候:
若该引用引用的是一个基类的对象,那么被调用的是基类的虚函数
若该引用引用的是一个派生类的对象,那么调用的是派生类的虚函数
这种行为也叫【多态】
class base
{
public:
virtual void some(){}
};
class derived:public base{
virtual void some(){}
}
int main(){
derived a;
base b;
base* p1=&a;
base* p2=&b;
base& r1=a;
base& r2=b;
p1->some();//调用derived类下的some()函数
p2->some();//调用base类下的some()函数
r1.some();//调用derived类下的some()函数
r2.some();//调用base类下的some()函数
return 0;
}
e.g:
A a;B b;E e;D d;
A* pa=&a; B* pb=&b;
D* pd=&d; E* pe=&e;
pa->print();//调用类A的print()
pa=pb;
pa->print();//调用类B的print()
pa=pd;
pa->print();//调用类D的print()
pa=pe;
pa->print();//调用类E的print()