先看一段代码:
#include <stdio.h>
class Parent{
public:
void Test(){
printf("parent Test");
}
};
class Child{
public:
void Test(){
printf("Child Test");
}
};
void main(){
Child ch;
ch.Test();
}
很明显这里将调用子类的Test, 因为子类重写了父类的办法。但如果我们仍然要调用父类的Test 该怎么办?
第一个办法是我们可以直接实例一个父类对象调用Test 。
第二个办法是用个父类指针指向一个之类对象调用Test ,从本质上讲子类的前半部分就是父类所以可以这样用。
Parent * ch = new Child(); ch->Test();
因为ch指向一个Child对象按照调用者本意我们希望调用子类的Test ,那么这时应该怎么办?
这就要提到虚拟继承virtual,当一个成员函数需要被子类重写时就可以在函数前声明virtual,此时,如果Test()在父类中被声明为virtual,是调用的是子类的Test()。这解释了virtual的作用:根据对象的实际类型,调用相应类型的函数。
virtual void Test(){ printf("parent Test"); }
这如果重写的时候,还是要嵌入调用一下父类的函数,怎么办?
void Child::Test() { Parent::Test(); // 显式地调用父类的函数 }
原文:http://www.cnblogs.com/rimonzheng/p/6502131.html