注意:本文中提到的所有方法都指的是同名,同返回类型,同参数类型的方法
多态:同一方法可以处理多种调用该方法的对象(即一个接口,多种实现)
多态的实现的前提:
1.多态得存在于继承体系中
class base
{
public:
void show()
{
cout<<"this is base show!"<<endl;
}
};
class D : public base //继承关系
{
public:
void show()
{
cout<<"this is D show!"<<endl;
}
};
void main()
{
D d;
base *p = &d; //p只能指向父类的函数和数据
p->show(); //此时show是父类中的show函数
}
2.多态的实现必须存在虚拟(virtual)关键字
若该方法在类外实现,则不用加关键字virtual
例如:
class base
{
public:
virtual void show() //加入virtual关键字使得子类虚拟继承父类,但实际上子类并不能调用此方法
{
cout<<"this is base show!"<<endl;
}
};
class D : public base //子类D继承父类base
{
void show()
{
cout<<"this is D show!"<<endl;
}
};
void main()
{
D d;
base *p = &d;
p->show(); //此时show调用的是D中的show方法
}
3.多态必须通过父类的引用或指针来实现
class base
{
public:
void show()
{
cout<<"this is base show()!"<<endl;
}
};
class D : public base
{
public:
void show()
{
cout<<"this is D show()!"<<endl;
}
};
void main()
{
D d;
base *p = &d; //通过指针实现多态
p->show();
base &q = d;
q.show(); //通过引用实现多态
}
虚函数的定义格式:
virtual 返回类型 函数名(参数列表)
注意:
1.virtual仅用于类定义中,若在类外定义虚函数不可以加关键字virtual
class base
{
public:
virtual void show(); //虚函数的声明
};
void base :: show() //虚函数的定义(在类外定义无需加virtual关键字)
{
cout<<"this is base show()!"<<endl;
}
>2.当某个类的一个类成员函数为虚函数,则由该类派生出来的所有类中,该函数始终保持虚函数的特征
class base
{
public:
virtual void show()
{
cout<<"this is base show()"<<endl;
}
};
class D : public base
{
public:
void show()
{
cout<<"this is D show()!"<<endl;
}
};
class C : public D
{
public:
void show()
{
cout<<"this is C show()!"<<endl;
}
}
void main()
{
C c;
D *pd = &c;
//因为D是base的派生类,base中的show是虚函数所以D中的也保持虚函数的特征
pd->show(); //此时调用的是C中的show方法
}