[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方法除外。

猜你喜欢

转载自blog.csdn.net/ykun089/article/details/106985934