C++中的两种绑定方式(静态绑定、动态绑定)

两种绑定方式

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

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

需要注意:

  1. 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()

	pg.fly();//penguin::fly()
	func1(pg);//bird::fly()
	func2(&pg);//bird::fly()
	return 0;
}
  1. 必须在程序中显式地指出动态绑定。

动态绑定的实现

动态绑定的实现条件:

  1. 类的定义中成员函数声明为虚函数
  2. 通过引用或指针来访问对象的虚函数

virtual声明需要注意:

  1. 一旦在基类中指定某成员函数为虚函数,那么,不管在派生类中是否给出virtual声明,派生类(以及派生类的派生类,…)中对其重定义的成员函数均为虚函数
  2. 重定义: 对派生类中定义的成员函数, 其函数名, 参数个数和类型以及返回值类型与基类的某个虚成员函数相同(override)

动态绑定示例:

#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;
}
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值