[c++] 规避虚函数的动态绑定

前言:

使用指针访问虚函数时,默认是跟着实例类型的,即指针指向什么类型实例,就使用这个类型的虚函数实现。

如果我们的指针指向的是子类实例,但是希望调用 基类 的虚函数版本,那么可以通过作用域运算符 :: 

注:这一特性是设计模式中  责任链模式  的核心实现手段。




例子:


class A{
public:
	A()=default;
	virtual ~A()=default;
public:
	virtual void func(int i = 10){
		printf("A = %d\n",i);
	}
};

class B :public A{
public:
	B()=default;
public:
	void func(int i = 20){
		A::func();				//在派生类中调用基类的版本
		printf("B=%d\n", i);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	A a1;
	B b1;

	A* p1 = &b1;
	B* p2 = &b1;

	p1->A::func();		//虽然p1指向的是派生类实例,但是通过作用域限制,要求其调用基类的版本
	p2->func();			//虽然p2是派生类指针,但是派生类的虚函数实现中,会先调用基类的实现

	getchar();
	return 0;
}



小结:

这个特性非常有用,当很多派生类 都用相同动作时,我们可以把这些动作合成一个虚函数放在基类中,然后大家一起继承并实现虚函数,然后各自在进行自己的特有业务之前,先使用这个方法调用基类的版本。




注意:

不能再基类中访问派生类的虚函数版本,因为基类是派生类的子集,作为内存中的实例,它是没有任何派生类的实例的,因此无法访问,不过public的statitc方法除外。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值