虚函数和虚函数表

原创 2018年04月15日 17:44:00

知识点:

1.虚函数:父类指针在指向它的多态类对象时,会根据不同类对象调用相应的函数,这个函数就是虚函数

2.虚函数用virtual修饰函数名,定义了虚函数后,可以在子类中对虚函数重新定义。如果没有重新定义,则继承。

3.接口统一,返回类型(除了协变情况)、参数类型、参数个数一致

实现过程:


1.编译器发现一个类中有虚函数时,便为该类生成虚表,虚表各表项为指向对应虚函数的指针。父类虚函数地址在前,子类在后,按照声明顺序。

2.父类指针指向子类对象时,如果子类中函数重写了父类中的函数,则用子类虚函数的地址覆盖掉对应父类虚函数的地址。

3.父类指针调用函数过程:

    到父类里,如果发现是虚函数,就到虚函数表里找到对应的虚函数指针。

        有覆盖:该指针指向子类函数,调用子类的函数。

        无覆盖:调用父类自己的函数。

4.每个对象都会生成一个虚表

纯虚函数:

含有纯虚函数的类称为抽象类,抽象类不能生成对象。纯虚函数不会被调用,主要用来统一管理子类对象。

注意点:

1.构造函数不能是虚函数

   构造函数初始化虚表指针vptr,虚函数放在虚表里。调用构造函数时,首先要知道虚表指针vptr。矛盾。

2.内联函数不能是虚函数

3.析构函数默认为虚函数

安全性

1.用父类指针调用子类中未覆盖父类的成员函数是非法的,但运行时可以通过指针访问虚表来实现该点。

2.如果父类虚函数时private或protected的,也可以通过指针访问虚表来访问non-public虚函数。

C++动多态实现之虚函数与虚表指针

最近在学习C++的动多态时,了解到关于虚函数表与虚表指针的知识点,感觉很有意思,因此总结记录下来(依据个人理解而写,欢迎批评指正)。1、静多态与命名倾轧,动多态与虚函数:(1)概述: 我们知道,C+...
  • Apollon_krj
  • Apollon_krj
  • 2017-03-27 18:07:22
  • 961

C++内存分布之虚函数和虚表

虚函数:就是在类中被关键字Virtual修饰的成员函数。虚函数的作用就是实现多态,即多态性是将接口与实现进行分离,简单就是说允许将子类类型的指针赋值给父类类型的指针,那么指向基类的指针在操作它的多态类...
  • armwind
  • armwind
  • 2016-07-12 23:08:30
  • 2528

详谈C++虚函数表那回事(多重继承关系)

C++多重继承关系中虚函数表相关
  • Li_Ning_
  • Li_Ning_
  • 2016-07-13 00:51:54
  • 1656

虚函数、虚函数表、虚继承

1、虚函数 虚函数的定义:       虚函数必须是类的非静态成员函数(且非构造函数),其访问权限是public(可以定义为privateor proteceted, 但是...
  • chinabhlt
  • chinabhlt
  • 2014-04-10 21:03:29
  • 1443

获取C++虚表地址和虚函数地址

获取C++虚表地址和虚函数地址                                By qianghaohao        学过C++的应该都对虚表有所耳闻,在此就不过多介绍概念了,通...
  • qianghaohao
  • qianghaohao
  • 2016-05-09 22:32:30
  • 8289

C++ 虚函数表研究 (二) 多重继承

C++ 虚函数表研究 (二) 多重继承
  • tangaowen
  • tangaowen
  • 2010-08-22 23:26:00
  • 5925

基类和派生类的虚函数表

查看派生类是否和基类公用一个虚函数表,或是否使用相同的虚函数(没有重新实现的情况下)。...
  • KangRoger
  • KangRoger
  • 2014-07-31 10:50:37
  • 3817

子类虚函数表(包括虚函数+函数)

对于多重继承,如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表。如下继承关系(没有覆盖): 在子类Derive实例中的虚函数表: 子类自己定义的虚函数会被放到了第一个基类的虚函数表中。 ...
  • fdsafwagdagadg6576
  • fdsafwagdagadg6576
  • 2016-06-16 15:29:07
  • 369

C++ 虚函数 修改虚表

#include #include using namespace std; class CC { public: virtual void Print() { cout
  • fysy0000
  • fysy0000
  • 2011-07-20 18:16:13
  • 925

通过虚函数表调用虚函数与通过虚函数表(绕过访问权限控制)

一、背景知识           在讲解虚函数的时候,我们知道,如果类中有虚函数,则该类中存在一个虚函数表(V-Table),每个该类的对象都会有一个指针指向该虚函数表,存储这类中虚函数的函数指针,而...
  • IIcyZhao
  • IIcyZhao
  • 2013-09-22 19:05:38
  • 1496
收藏助手
不良信息举报
您举报文章:虚函数和虚函数表
举报原因:
原因补充:

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