纯虚函数声明:virtual 函数名(参数列表) = 0;
纯虚函数的作用:是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。
注意:
- 纯虚函数没有实现体,不具备函数的功能,不能被调用。
- 最后面的=0,只起形式上的作用,告诉编译器这是“纯虚函数”。
- 如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然属于纯虚函数。
抽象类:不用定义对象而只作为一种基本类型用作继承的类叫做抽象类(也叫接口类),凡是包含纯虚函数的类都是抽象类。
抽象类的作用:是作为一个类族的共同基类,为一个类族提供公共接口,抽象类不能实例化出对象。 纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。
class Brid //抽象类
{
public:
Brid(std::string name) :mname(name){}
virtual void Fly() = 0;//纯虚函数
protected:
std::string mname;
};
class Eagle:public Brid
{
public:
Eagle(std::string name) :Brid(name){}
void Fly()//派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同!
{
std::cout << mname << " can fly 100m!" << std::endl;
}
};
class Chicken: public Brid
{
public:
Chicken(std::string name) :Brid(name){}
void Fly()
{
std::cout << mname << " can not fly!" << std::endl;
}
};
int main()
{
Brid *pb1=new Eagle("eagle");
Brid *pb2=new Chicken("Chicken");
pb1->Fly();
pb2->Fly();
return 0;
}
4种类型转换
const_cast 去除常性
static_cast 安全性高
reinterpret_cast c转换
dynamic_cast RTTI
void ShowFly(Brid* pb)
{
Chicken* pc = dynamic_cast<Chicken*>(pb);//dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
if (pc == NULL)
{
pb->Fly();
}
else
{
std::cout << "Chicken can fly 0m!" << std::endl;
}
//if (typeid(Chicken) == typeid(*pb))
//{
// std::cout << "Chicken can fly 0m!" << std::endl;
//}
//else
//{
// pb->Fly();
//}
}
int main()
{
Eagle e("eagle");
Chicken c("chicken");
ShowFly(&e);
ShowFly(&c);
return 0;
}