C++虚函数探索!
C++中的虚函数实现了C++中的多态。昨天C++老师着重讲了讲虚函数。这个很重要,也有点玄机在里面。
下面阐述一下理论:
C++的类机制中有支持多态的技术来解决抽象编程。使用的是滞后捆绑技术。即预先设定其成员函数虚函数性质,使得任何捆绑该成员函数的未定类型
的对象操作在编译时,都是以一个不确定的指针特殊地“引命待发”来编码,运行时,遇到确定类型的对象,才突然制定真正的行为。
然后是一个示例程序:
using namespace std;
class A{
public:
virtual void showMessage(){
cout<<"我是A!"<<endl;
}
A(){};
A(const A& a){
cout<<"调用A的构造函数"<<endl;
}
};
class B:public A{
public:
virtual void showMessage(){
cout<<"我是B!"<<endl;
}
};
int main(){
B b;
A *p=new B;
((A)b).showMessage();
((A*)p)->showMessage();
return 0;
}
你先不要往下看,想想会输出什么?
----------------------------------------------------------------------------------
这个程序会输出:
调用A的构造函数
我是A!
我是B!
下面说一下原理,虚函数本身在编译过程中,会产生一个虚函数指针,而这个虚函数指针会指向一个虚表,虚表中
存有虚函数的地址,指向虚函数的方法。
一旦基类A的指针指向B(B继承A),基类中虚函数指针就会被继承的子对象的虚函数指针所覆盖。
那么就知道为什么会输出我是B!了。
理解这个之前还要知道:
1.父类声明虚函数子类同名函数自动也成为虚函数。
2.虚函数不能实例化,只能定义指针。
3.拥有纯虚函数的类就是抽象类。
下面在解释为什么输出,我是A!
因为从输出结果就可以看出,b对象经过强制类型转换成A以后,调用了A的构造函数。
所以A中的虚指针被恢复。所以输出了我是A!
下面是定义虚函数的五条限制:
1.只有类成员函数才能声明为虚函数。
2.静态成员函数不能是虚函数
3.内联函数不能是虚函数
4.构造函数不能是虚函数
5.析构函数可以是虚函数且通常声明为虚函数。
推荐好好运行和分析第一条评论里的程序,那位老师的体会比我深。
转载注明:www.cnblogs.com/shiyangxt
作者:Steven(Steven's Think out)
出处:http://shiyangxt.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。