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,如需转载请自行联系原作者

相关文章
|
2月前
|
C++
9. C++虚函数与多态
9. C++虚函数与多态
33 0
|
2月前
|
设计模式 编解码 算法
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(三)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
43 0
|
2月前
|
存储 设计模式 编译器
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(一)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
72 0
|
4月前
|
存储 C++ 容器
第十四章:C++虚函数、继承和多态详解
第十四章:C++虚函数、继承和多态详解
29 0
|
4月前
|
C++
C++析构函数定义为virtual虚函数,有什么作用?
C++析构函数定义为virtual虚函数,有什么作用?
31 0
|
2月前
|
算法 安全 编译器
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
【C++ 关键字 override】C++ 重写关键字override(强制编译器检查该函数是否覆盖已存在的虚函数)
29 0
|
2月前
|
算法 Java 编译器
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
【C++ 关键字 virtual 】C++ virtual 关键字(将成员函数声明为虚函数实现多态
28 0
|
2月前
|
存储 编译器 C++
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
【C++练级之路】【Lv.13】多态(你真的了解虚函数和虚函数表吗?)
|
17天前
|
C++
C++虚函数学习笔记
C++虚函数学习笔记
16 0
|
1月前
|
C++
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用
C++示例(电脑组装)展现C++多态的优势以及虚函数抽象类的应用