C++中的虚函数简介(上)

原创 2017年09月18日 22:33:23

继承inheritance是面向对象设计(object-oriented programming中的一个非常重要的思想,通过继承,可以定义相似的类型并对其相似关系进行建模。通过继承联系在一起的类构成了一种层次关系。通常在层次关系的根部有一个基类(base class),其它类则直接或间接地从基类继承而来,这些继承得到的类称为派生类(derived class)。

对于基类的函数,派生类可以直接继承,也可以将基类的函数修改为适合自身的版本。基类将派生类要修改的函数声明为虚函数(virtual function)。

1 虚函数的定义

1.1 在基类中声明虚函数

声明函数时,在函数的返回值前加入virtual关键字,表示该成员函数为虚函数,可以被派生类修改。

class Base
{
public:
   virtual void Base_Func();
}

1.2 在基类中定义虚函数

Base类内部定义虚函数时,和定义普通函数的方法类似。需要注意的时,如果在Base类的外部定义虚函数时,不能使用virtual关键字。

void Base::Base_Func()
{
  cout<<”Base::Base_Func().\n”;
}
也就是说,虚函数只是在声明时使用virtual,在定义时不能使用virtual

1.3 在派生类中使用虚函数

定义Base类的派生类Derived,如果要在派生类Derived中重写Base类的虚函数Base_Func(),需要在Derived类中声明该函数。在派生类中声明虚函数时,可以加virtual关键字,也可以不加。因为该函数在基类中已经声明为虚函数,则在派生类中也为虚函数。与在“1.2 在基类中定义虚函数”中相同,在派生类的外部定义虚函数时,也不能加virtual关键字。

class Derived:public Base
{
public:
void Base_Func();
}
void Derived::Base_Func()
{
   cout<<”Derived::Base_Func.\n”;
}

2虚函数的使用

有如下代码

Base *pbase = new Derived();
pbase->Base_Func();
delete pbase;
因为每个派生类对象都包含基类部分,所以可以将基类的指针指向派生类对象。第一行代码将基类Base的指针指向了派生类的Derived的对象。第二行代码通过该指针调用Base_Func()函数,由于pbase指针可能指向基类,也可能指向派生类,所以在程序编译时,无法确定调用的Base_Func()函数时哪个函数,在运行时才能够确定调用哪个函数,即派生类的Base_Func()函数。

所以,此时程序的输出为

 

1 派生类函数的输出

3 虚函数分析

C++编译器发现一个类中有被声明为virtual的函数时,就会为其产生一个虚函数表VTABLEVTABLE实际上是一个函数指针的数组。一个类只有一个VTABLE,派生类也有自己的VTABLE,但是派生类的VTABLE与基类的VTABLE有相同的函数排列顺序,同名的虚函数被放在两个数组的相同位置。在创建类的实例时,编译器还会在每个实例的内存布局中增加一个vptr字段,该字段指向本类的VTABLE

 

2 vptrVTABLE

在本程序中,可以看到pbase的值和pderived的值如图3所示。

 

3 pbase的值和pderived的值

即此时pbase指向0x00e7f6c0的内存;而pderived指向0x00e7fa58的内存。接下来看一下这两处内存的内容,如图5和图6所示。

即,此时pbase->vptr的值是0x00b19b34,而pderived->vptr的值是0x00b19b58。两个内存地址即为Base类和Derived类的VTABLE的地址,里面的内容即为这两个类虚函数Base_Func()的地址,如图7所示。

 

7 VTABLE内容

Base::Base_Func()的地址是0x00b11235;而Derived::Base_Func()的值是0x00b110f5

C#抽象类、接口、虚函数和抽象函数

C#抽象类和接口 转载自:http://blog.csdn.net/lwk2011/article/details/5974383 抽象类和接口的异同 一、抽象类:       抽象类...
  • baidu_21132571
  • baidu_21132571
  • 2014年11月08日 15:42
  • 1492

c++中的虚函数、虚基类、类模板

一、虚函数 首先要明白C++为什么要引进虚函数这个机制, 虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过...
  • zyazky
  • zyazky
  • 2016年08月15日 14:17
  • 1575

虚函数和纯虚函数的作用与区别

虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 ...
  • xwpc702
  • xwpc702
  • 2013年03月13日 19:28
  • 42145

C++虚函数的应用

  • 2013年12月15日 20:32
  • 490KB
  • 下载

C++继承,虚函数与多态性专题.

  • 2012年05月05日 19:35
  • 333KB
  • 下载

C++程序设计课件 ch12 多态性与虚函数

  • 2013年05月29日 07:10
  • 1.29MB
  • 下载

C++中虚函数的实现机制

  • 2011年10月27日 13:33
  • 112KB
  • 下载

C++中虚函数深度探索

  • 2011年10月04日 16:01
  • 47KB
  • 下载

深入C++虚表(虚函数 虚表 反汇编)

  • 2010年05月28日 12:43
  • 260KB
  • 下载

C++实验报告( 利用虚函数编程)

  • 2017年11月11日 19:32
  • 102KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++中的虚函数简介(上)
举报原因:
原因补充:

(最多只允许输入30个字)