#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;
}
多态性和虚函数
最新推荐文章于 2024-07-14 13:40:19 发布