/*
静态联编(static binding):在编译阶段,确定函数的跳转地址.早期联编.
动态联编(dynamic binding):在运行阶段,根据指向的对象,动态地确定跳转地址.晚期联编.
*/
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void move(void)
{
cout<<"动物在移动....."<<endl;
}
};
class Fish:public Animal
{
public:
void move(void)
{
cout<<"鱼在游泳..."<<endl;
}
};
//鱼的子类
class Whale:public Fish
{
public:
void move(void)
{
cout<<"抹香鲸在游泳..."<<endl;
}
};
class Tortoise:public Animal
{
public:
void move(void)
{
cout<<"乌龟在缓慢爬行中....等等我"<<endl;
}
};
void start_moving(Animal &a)//同一个接口
{
//在有多态技术辅助时,a的move是呈现不同的状态的
a.move();
//Animal有三种派生类,就会有3个不同的move,函数的地址不同
//编译的时候在这里也无法确定,只有到了运行时才能确定调到那个move去运行.
}
int main(void)
{
Fish fish;
Tortoise tortoise;
Whale whale;
cout<<"fish的大小:"<<sizeof(fish)<<endl;
Animal *p=NULL;
int i;
cin>>i;
if(i>100)
p=&whale;
else
p=&fish;
//运行后才知道指向谁
start_moving(*p);
}
接口
/*
纯虚函数
纯虚函数主要用来实现接口.
同一个接口:指统一的函数名,参数名,参数类型,返回值.
纯虚函数是在函数的括号后面加上=0
拥有纯虚函数的类是抽象类.
抽象类:没有实例,只能做基类.
*/
#include <iostream>
using namespace std;
class Animal
{
public:
virtual void move(void)
{
cout<<"动物在移动....."<<endl;
}
virtual void eat(void)
{
cout<<"进食中..."<<endl;
}
};
class Fish:public Animal
{
public:
void move(void)
{
cout<<"鱼在游泳..."<<endl;
}
};
//鱼的子类
class Whale:public Fish
{
public:
void move(void)
{
cout<<"抹香鲸在游泳..."<<endl;
}
};
class Tortoise:public Animal
{
public:
void move(void)
{
cout<<"乌龟在缓慢爬行中....等等我"<<endl;
}
};
class Fly //是个无法创建实例的类,是一个抽象类
{
virtual void fly(void)=0; //这个是纯虚函数,后代应该重写
};
class Bird:public Animal,public Fly
{
void fly(void)
{
cout<<"鸟在飞翔"<<endl;
}
};
class Butterfly:public Animal,public Fly
{
void fly(void)
{
cout<<"蝴蝶飞翔"<<endl;
}
};
void start_moving(Animal &a)//同一个接口
{
//在有多态技术辅助时,a的move是呈现不同的状态的
a.move();
//Animal有三种派生类,就会有3个不同的move,函数的地址不同
//编译的时候在这里也无法确定,只有到了运行时才能确定调到那个move去运行.
}
int main(void)
{
Fish fish;
Tortoise tortoise;
Whale whale;
}