C++:虚函数和多态



//举例理解虚函数和多态
#include <iostream>
using namespace std;

/*
           动物
	      /    |    \
        陆动物 水动物
	   / | \
	  狗 马

这里的动物、陆动物、水动物都是抽象类,因为他们不存在实例(对象)
没有一个具体的"它",可以说"它是动物"(这里是“是”不是“属于”的意思
而狗类可以有一个具体"它",可以说,"它是狗"。
我们说“狗是动物”,这里的“是”其实是“属于”的意思。
因此,可以理解为——抽象类是那种只能说“X属于该类”的类
而非抽象类就是可以说“X是该类”的类	  
 */

//动物类(抽象类)
//含有一个或一个以上纯虚函数的类叫做抽象类
class A {
public:
	virtual void show() = 0; //纯虚函数
};



//陆动物类 这里假定不是抽象类
class B1 : public A {
public:
	virtual void show() //虚函数
	{
		cout << "B1" << endl;
	}
};

//水动物类 这里假定不是抽象类
class B2 : public A {
public:
	virtual void show()
	{
		cout << "B2" << endl;
	}
};

//狗类
class C1 : public B1 {
public:
	virtual void show()
	{
		cout << "C1" << endl;
	}
};

//马类
class C2 : public B1 {
public:
	virtual void show()
	{
		cout << "C2" << endl;
	}
};

void ff(B1 *b1)
{
	b1->show();
}

void _ff(B1& b1)
{
	b1.show();
}

void w_ff(B1 b1)
{
	b1.show();
}

void f(A* a)
{
	a->show();
}

void _f(A& a)
{
	a.show();
}

/*
//抽象类不能有对象
//下面的函数声明非法
void w_f(A a) 
{
	;
}
*/

int main()
{
	B1 b1;
	B2 b2;
	C1 c1;
	C2 c2;

	ff(&b1);  //陆动物是陆动物
	//ff(&b2); 水动物既不是陆动物也不属于陆动物
	ff(&c1); //狗属于陆动物(当然不可能有陆动物属于狗,或陆动物是狗)
	         //更明显的例子是: b1 = c1是合法的, c1 = b1是非法的, b2 = c1更是牛马不相及
	ff(&c2);
	cout << endl;

	//等效于用指针
	_ff(b1);
	_ff(c1);
	_ff(c2);
	cout << endl;

	//如果用传值呢?
	w_ff(b1); //输出B1
	w_ff(c1); //输出B1
	w_ff(c2); //输出B1
	//b1没问题 c1传进入,等效于b1 = c1,那么一只狗变成了一个陆动物类的实例了
	//调用的show当然是陆动物的show了
	//(已经假定陆动物类不是抽象类)
	//c2同理
	cout << endl;

	f(&b1);
	f(&b2);
	f(&c1);
	f(&c2);
	cout << endl;

	_f(b1);
	_f(b2);
	_f(c1);
	_f(c2);
	cout << endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值