纯虚函数

纯虚函数声明:virtual 函数名(参数列表) = 0;
纯虚函数的作用:是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义。如果在基类中没有保留函数名字,则无法实现多态性。

注意:

  1. 纯虚函数没有实现体,不具备函数的功能,不能被调用。
  2. 最后面的=0,只起形式上的作用,告诉编译器这是“纯虚函数”。
  3. 如果在一个类中声明了纯虚函数,在其派生类中没有对其函数进行定义,则该虚函数在派生类中仍然属于纯虚函数。

抽象类:不用定义对象而只作为一种基本类型用作继承的类叫做抽象类(也叫接口类),凡是包含纯虚函数的类都是抽象类。
抽象类的作用:是作为一个类族的共同基类,为一个类族提供公共接口,抽象类不能实例化出对象。 纯虚函数在派生类中重新定义以后,派生类才能实例化出对象。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值