多态的目的是为了方便接口重写
实现一个接口,多种方法,
class A{
public:
//定义虚函数,这里关键字 virtual很重要,影响后面子类重写方法能否成功
virtual void fun1(){
某某操作;
}
}
class B:public A{
public:
//重写父类方法
void fun1(){
B操作
}
}
class C:public A{
public:
//重写父类方法
void fun1(){
C操作
}
}
void main(){
A *a; //父类指针
B b; //子类对象
C c;
a=&b; //父指向子
a->fun1(); //指针指向子类的实现方法(这里是“B操作”)
a=&c; //父指向子
a->fun1(); //指针指向子类的实现方法(这里是“c操作”)
}
关键字 virtual
没有关键字 virtual,函数会在编译时就绑定好了,是静态链接。所以当基类指针调用方法时,不会指向子类中的重写方法,而是指向基类自身
有关键字 virtual,函数会在运行时根据指针所指绑定相应的方法,是动态链接。
纯虚函数
参数个数应该相同,
class A{
virtual void fun()=0;
}
void A::fun(){ //错误,纯虚函数无法在父类定义,但必须在子类中定义,否则也错误
某操作
}