C++两种绑定方式

  • 静态绑定:在编译时刻,根据指针或引用变量的静态类型来决定成员函数属于哪一个类。
  • 动态绑定:在运行时刻,根据指针或引用指向的对象类型来确定成员函数属于哪一个类。

静态绑定

虽然存在继承关系,但是没有虚函数

#include<iostream> 
using namespace std;

class bird{
	public:
		void fly(){cout<<"bird fly"<<endl;};//鸟会飞
		void walk(){cout<<"bird walk"<<endl;}//鸟会走
};

class penguin: public bird{
	public:
		void swim();//企鹅会游泳
		void fly(){cout<<"penguin can not fly"<<endl;}
		void walk(){cout<<"penguin walk"<<endl;}
};

void func1(bird&bd){
	bd.fly();
}
void func2(bird*pb){
	pb->fly();
}

int main(){
	bird bd;
	penguin pg;

	bd.fly();//bird::fly()
	func1(bd);//bird::fly()
	func2(&bd);//bird::fly()

    //静态绑定,因为func的参数是bird。虽然pg是bird的派生类,但是fly并不是虚函数
	pg.fly();//penguin::fly()
	func1(pg);//bird::fly()	
	func2(&pg);//bird::fly()
	return 0;
}

动态绑定

动态绑定的实现条件:

  1. 类的定义中成员函数声明为虚函数
  2. 通过引用或指针来访问对象的虚函数
#include<iostream> 
using namespace std;

class bird{
	public:
		virtual void fly(){cout<<"bird fly"<<endl;};//鸟会飞
		void walk(){cout<<"bird walk"<<endl;}//鸟会走
};

class penguin: public bird{
	public:
		void swim();//企鹅会游泳
		void fly(){cout<<"penguin can not fly"<<endl;}
		void walk(){cout<<"penguin walk"<<endl;}
};

void func1(bird&bd){
	bd.fly();
}
void func2(bird*pb){
	pb->fly();
}

int main(){
	bird bd;
	penguin pg;

	bd.fly();//bird::fly()
	func1(bd);//bird::fly()
	func2(&bd);//bird::fly()

	pg.fly();//penguin::fly()
	func1(pg);//penguin::fly()
	func2(&pg);//penguin::fly()
	getchar();
	return 0;
}