滴水3.权限控制+虚函数表---虚表函数

1.头文件的引入使得结构简洁

 2.私有与公共

1、对外提供的函数或者变量,发布成public的 但不能随意改动.

2、可能会变动的函数或者变量,定义成private的 这样编译器会在使用的时候做检测.

3、只有结构体内部的函数才可以访问private的成员.

4、public/private可以修饰函数也可以修饰变量.


3.私有的如何访问
 

 

 

private修饰的成员与普通的成员没有区别 只是编译器会检测.

private修饰的成员只要自己的其他成员才能访问
4.私有的优势
由上图代码,我们需要在内部给变量赋值,这样我们就可以对这个变量的赋值进行各种操作
5.类与结构区别  
成员权限区别
编译器默认class中的成员为private 而struct中的成员为public
父类中的程序继承后变成private属性  如果不希望改变成员的属性: class Sub:public Base


6.私有是否可以被继承
1、父类中的私有成员是会被继承的

 2、只是编译器不允许直接进行访问

 


7.继承的构造函数的先后顺序

先执行父类的构造函数 再执行子类的构造函数

 

 

 

 

--------------------------------------------------------------------------------------------------------------------

下午虚函数表

虚函数

直接 --间接 调用

 virtual 虚表函数

汇编查看
 

 

 

通过对象调用是直接调用

用地址进行调用

 

进行间接调用

 

 

 


 
 虚函数对结构体大小  
我们创建多个虚函数 但是在打印大小的时候发现大小只有4,这是为什么呢

这是因为在这个结构体中存取了虚表函数的一个索引清单

进入四字节---倒序查看

 

 

遍历所以虚表函数

#include<stdio.h>
class mu
{
public:
    void f1()
    {

        printf("1");
    }

    virtual void fu2()
    {
        printf("我a");


    }
    virtual void fu3()
    {
        printf("我b");


    }    

private:

};
int main()
{
    mu mu1;
    mu* q = &mu1;
    printf("%x\n",*(int*)&mu1);
    typedef void(*as)(void);
    as as1;
    for (int i = 0; i < 2; i++)
    {
        int temp =     
    *((int*)
    (*(int*)&mu1) + i);
        as1 = (as)temp;
        as1();
    }
    return 0;
}

 

 

 



 

 




 

 



重写与重载区别
由于VS2019是直接调用 但是虚函数表还是有滴,故此不进行分析

posted @ 2022-12-13 10:44  逆向狗  阅读(35)  评论(0)    收藏  举报