多态性和虚函数

#include <iostream>
#include <string>
using namespace std;

enum note
{ 
	middleC,
	Csharp,
	Eflat
};
class Instument  // 这个是一个纯抽象类因为它所有的抽象函数都是纯虚函数,只有一个纯虚函数就是普通的抽象类,不能用来创建对象可以用来做接口,
{
public:
	virtual void play(note) const = 0;  // 这就是纯虚函数,
	
	virtual char* what() const = 0;
	
};

char* Instument::what() const  // 这个就是纯虚函数的定义,
{
	return "xiao cui cui";
}

class Wind : public Instument
{
public:
	void play(note) const // 在这里虽然没有写virtual 但是它继承下来的还是虚函数,
	{
		cout << "Wind::play" << endl;
	}
	char* what() const
	{
		return "Wind";
	}
};

class Percussion : public Instument
{
public:
	void play(note) const
	{
		cout << "Percussion::play" << endl;
	}
};

class Stringed : public Instument
{
public:
	void play(note) const
	{
		cout << "Stringed::play" << endl;
	}
};

class Woodwind : public Wind
{
public:
	void play(note) const
	{
		cout << "Woodwind::play" << endl;
	}
};

class Brass : public Wind
{
public:
	void play(note) const
	{
		cout << "Brass::play" << endl;
	}
};

void tune(Instument& i)  // 多态要传地址或者传引用,
{
	i.play(middleC);    // 这个play函数是在运行的时候判断调用调用虚函数,
	//早绑定就是在编译的时候就知道是不是虚函数;而虚函数在运行动态的进行绑定称为晚绑定,
}

class Animal
{
private:
	string pname;
public:
	Animal(const string& nm) : pname(nm){}
	virtual string name() const { return pname; }
	~Animal(){}
	virtual string description() const
	{
		return "This is " + pname;
	}
};

class Horse : public Animal
{
private:
	string favoriteActivity;
public:
	Horse(const string& nm, const string& activity)
		: Animal(nm), favoriteActivity(activity) {}
	string description() const
	{
		return Animal::name() + "like to" + favoriteActivity;
	}
};
void describe(Animal& a) // 这个地方传地址传引用就是多态,
{
	cout << a.description() << endl;
}


int main()
{
	Animal a("AAAA");
	Horse h("BB", "CCC");
	describe(a);
	describe(h);

	/*Instument i;
	tune(i);*/

	//Wind w;
	//tune(w);  // 在这里使用虚函数就可以使

	//Percussion per;
	//tune(per);

	//Brass bra;
	//tune(bra);


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值