如果我们希望明确指定调用 基类 还是 子类的虚函数版本。那么可以通过作用域运算符 ::
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方法除外。