【C/C++】【对象模型】虚函数

2020-12-19 20:41

阅读:784

标签:链接   创建   ++   超出   入口   存在   lse   时机   不同   

虚函数表指针位置分析

类:有虚函数,会产生一个虚函数表;

类对象:有一个指针,指针vptr会指向虚函数表的开始地址;

虚函数指针的位置

虚函数表位于整个对象模型的顶端;

// objModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 
using namespace std;
class A
{
public:
    virtual void func() {};

public:
    int i;
};

int main()
{
    A a;
    cout (&a);
    char* q = reinterpret_cast(&a.i);

    if (p == q) //如果二者位置相同,说明i在对象的上面;虚函数表指针vptr在下面;
        cout 

继承关系作用下虚函数的手工调用

技术图片

// objModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include 
using namespace std;
class Base
{
public:
    virtual void func()
    {
        cout 

虚函数表分析

  • 一个类只有包含虚函数才存在虚函数表,同属于一个类的对象共享虚函数表,但是有各自的vptr(虚函数指针),所指向的虚函数的入口地址都是相同的;

    // objModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include 
    using namespace std;
    class Base
    {
    public:
        virtual void func()
        {
            cout 
  • 父类中有虚函数,子类中有虚函数;即父类中有虚函数表,子类中肯定也有虚函数表;

  • 无论是父类还是子类都会只有一个虚函数表,不能认为子类中有一个虚函数表 + 父类中一个虚函数表,得到子类中有两个虚函数表;

    子类中是否可能有多个虚函数表?

  • 如果子类中完全没有新的虚函数,则我们可以认为子类的虚函数表和父类的虚函数表内容相同;但仅仅是内容相同,这两个表在内存中处于不同位置;

  • 虚函数表中每一项,保存一个虚函数的入口地址,如果子类的虚函数表某项和父类虚函数表某项相同(这表示子类没有覆盖父类的虚函数);

  • 超出虚函数表部分内容不可知;无实际意义;

// objModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//基类不同对象虚函数指针
//基类和父类对象 虚函数指针

#include 
using namespace std;
class Base
{
public:
    virtual void func()
    {
        cout 

多重继承虚函数表分析

  • 一个对象,如果它的类有多个基类则有多个虚函数表指针(注意是两个虚函数表指针,而不是两个虚函数表);

  • 在多继承中,对应各个基类的vptr按照继承顺序依次放置在类的内存空间中,且子类与第一个基类公用一个vptr(第二个基类有自己的vptr);

技术图片

  • 子类对象有两个虚函数表指针,vptr1和vptr2;

  • 类Derived有两个虚函数表,因为它继承自两个基类;

  • 子类和第一个基类公用一个vptr(应为vptr指向一个虚函数表,所以也可以说子类和第一个基类公用一个虚函数表vtb1)

    因为我们注意到类Dreived的虚函数表1里面的5个函数u,g正好是基类1里面的函数;

  • 子类中的虚函数覆盖了父类中的同名虚函数;


#include 
using namespace std;



class Base_1
{
public:
	virtual void func()
	{
		cout 

vptr/vtbl创建时机

辅助工具: **cl.exe ** 编译链接工具

虚函数调用问题

【C/C++】【对象模型】虚函数

标签:链接   创建   ++   超出   入口   存在   lse   时机   不同   

原文地址:https://www.cnblogs.com/Trevo/p/13367558.html


评论


亲,登录后才可以留言!