一、虚函数
 **;类中定义不同类中的同名函数的多态的行为**,主要是通过虚函数来实现。
在类的成员函数前加virtual关键字。虚函数是实现包含多态的基础。这里需要说明的是当基类里有虚函数且派生类中重新声明了和基类虚函数相同的函数,那么派生类该函数也是虚函数,这个过程称为对基类虚函数进行重写,这对于实现包含多态有重要意义。
【包含多态的条件】
基类中必须包含虚函数,并且派生类中一定要对基类中的虚函数进行重写。通过基类对象的指针或者引用调用虚函数。
示例:
#include <iostream>
using namespace std;
const double PI = 3.14159;
class cpoint
{
public:
cpoint(double a, double b)
{
x = a;
y = b;
}
virtual double area()
{
return 0;
}
private:
double x, y;
};
class ccircle :public cpoint // 圆类 继承cpoint
{
public:
ccircle(double a, double b, double c) :cpoint(a, b)
{
r = c;
}
double area()
{
return PI * r * r;
}
private:
double r;
};
class cractangle :public cpoint // 矩形类 继承cpoint
{
public:
cractangle(double a, double b, double c, double d) :cpoint(a, b)
{
w = c;
h = d;
}
private:
double w, h;
};
void Funcarea(cpoint &p)
{
cout << "area=" << p.area() << endl;
}
int main()
{
ccircle cobj(5.5, 6.6, 10);
Funcarea(cobj);
cractangle cobjc(3, 4, 5, 6);
Funcarea(cobjc);
return 0;
}
二、抽象类
纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义具体的操作内容,要求各派生类根据实际需要给出各自的定义。纯虚函数的声明格式为:
virtual 函数类型 函数名 (参数表) = 0;
而抽象类就是指带有纯虚函数的类。
示例:
#include <iostream>
#include <string>
using namespace std;
class CAnimal // 抽象类
{
public:
virtual void CallFunc()=0; // 纯虚函数
private:
string name;
};
class CCattle :public CAnimal // 派生出牛类
{
public:
virtual void CallFunc();
private:
int age;
};
class CDog :public CAnimal // 派生出狗类
{
public:
virtual void CallFunc();
private:
int age;
};
void CallFunc(CAnimal &sp) // 通过传递不同的对象实参,可以调用产生对应的成员函数,以实现多态功能
{
sp.CallFunc();
}
void CCattle::CallFunc() {
cout << "哞哞叫......哞哞叫" << endl;
}
void CDog::CallFunc() {
cout << "汪汪汪叫......汪汪汪叫" << endl;
}
int main()
{
CCattle cobj;
CallFunc(cobj);
CDog dobj;
CallFunc(dobj);
return 0;
}