# include <iostream>
# include <math.h>
# include <stdio.h>
using namespace std;
class animal
{
public:
virtual void sleep()
{
cout << "animal sleep" << endl;
}
void breath()
{
cout << "animal breath" << endl;
}
virtual void eat() = 0;
//描述一些事物的属性给别人,而自己不想去实现,就可以定义为纯虚函数
virtual ~animal(){};
};
class fish:public animal
{
public:
virtual void sleep()
{
cout << "fish sleep" << endl;
}
void breath()
{
cout << "fish breath" << endl;
}
virtual ~fish(){};
};
int main()
{
fish fh;
animal *p = &fh; //隐式类型转换
p->breath();//没有定义虚函数,不会调用fish的breath() 输出animal breath
p->sleep(); //定义虚函数,调用fish的sleep();
return 0;
}
//c++编译器在编译器的时候,要确定每个对象调用的函数(要求此函数是非虚函数)地址,
//称为早起绑定,当我们将fish类的对象的fh的地址赋值给p时,C++编译器进行了类型转换,
//此时C++编译器认为变量p保存的就是animal对象的地址。当在main函数中执行了p->breath()时
//调用的当然是animal对象的breath函数