开发者社区> 文艺小青年> 正文

C++虚函数探索!

简介:
+关注继续查看

C++中的虚函数实现了C++中的多态。昨天C++老师着重讲了讲虚函数。这个很重要,也有点玄机在里面。

下面阐述一下理论:

C++的类机制中有支持多态的技术来解决抽象编程。使用的是滞后捆绑技术。即预先设定其成员函数虚函数性质,使得任何捆绑该成员函数的未定类型

的对象操作在编译时,都是以一个不确定的指针特殊地“引命待发”来编码,运行时,遇到确定类型的对象,才突然制定真正的行为。

然后是一个示例程序:

复制代码
#include<iostream>
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.析构函数可以是虚函数且通常声明为虚函数。

 本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/19/1358297.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
C++继承与派生解析(继承、重载/转换运算符、多重继承、多态、虚函数/纯虚函数、抽象类)
58 0
C++学习——虚函数与纯虚函数
C++学习——虚函数与纯虚函数
98 0
C++不要在构造或析构函数中调用虚函数
C++不要在构造或析构函数中调用虚函数
84 0
【C++】C++虚函数知识点总结
【C++】C++虚函数知识点总结
58 0
【阿里面试】C++多态和虚函数
2.1 现在假设有一个编译好的C++程序,编译没有错误,但是运行时报错,报错如下:你正在调用一个纯虚函数(Pure virtual function call error),请问导致这个错误的原因可能是什么?
106 0
【C++面试】虚函数和纯虚函数
因为写代码时不能在一开始就确定被调用的是基类的函数,还是哪个派生类的成员函数,所以C++通过虚函数实现多态,即在基类中用virtual声明,父类可以引用子类对象(如Human* phuman1 = new Men;父类类型指针phuman指向子类对象),子类成员函数可以重写父类方法(函数)。
49 0
C++多态性原理详解(静态多态、动态多态、虚函数、虚函数表)
C++多态性原理详解(静态多态、动态多态、虚函数、虚函数表)
132 0
「现代C++设计魅力」虚函数继承-thunk技术初探
工作中使用LLDB调试器调试这一段C++多继承程序的时候,发现通过lldb print(expression命令的别名) 命令获取的指针地址和实际理解的C++的内存模型的地址不一样。那么到底是什么原因呢?
503 0
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)
【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )(二)
89 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
继承与功能组合
立即下载
对象的生命期管理
立即下载
移动与复制
立即下载