016 虚函数

 

/*
目录:
    一 概念
    二 简单对比
*/    

 

一 概念

/*

// 虚函数    
    虚函数一定是重写函数,在基类重写函数前加virtual
    
    使用:
        1 类对象: 使用什么对象调用对应类的重写函数
        2 基类指针: 
            (1) 调用普通函数: 对应类函数 
            (2) 调用virtual函数: 指针指向的类
    
    原理: 
        1 对象首部多个指针,指针指向虚表        
        
    思想:
        抽象与实现
            基类: 概念、抽象
            派生类: 具体对象
        
        静态绑定和动态绑定
            静态: 编译时绑定,通过对象调用(对象类型)
            动态: 运行时绑定,通过地址调用(根据虚表)
            
// 纯虚函数: 
        1 不能定义基类对象
        2 派生类必须有重写函数
        3 含纯虚函数的基类,叫做抽象类。纯虚函数也称为抽象函数。
*/

 

二 简单对比

#pragma once
#include <iostream>

using namespace std;

class CBase
{
public:
    void RealFunc()
    {
        cout << "CBase::RealFunc()" << endl;
        m_i = 0x10;
    }
    virtual void VirtualFunc()
    {
        cout << "CBase::VirtualFunc()" << endl;
        m_i = 0x11;
    }

    int m_i;
};


class CDerived :public CBase
{
public:
    void RealFunc()
    {
        cout << "CDerived::RealFunc()" << endl;
        m_j = 0x20;
    }
    void VirtualFunc()
    {
        cout << "CDerived::VirtualFunc()" << endl;
        m_j = 0x22;
    }

private:
    int m_j = 0x88;
};


int main()
{
    CBase b;
    b.RealFunc();
    b.VirtualFunc();
    cout << sizeof(b) << endl;

    CDerived d;
    d.RealFunc();
    d.VirtualFunc();
    cout << sizeof(d) << endl;

    CBase *pb;
    pb = &b;
    pb->RealFunc();
    pb->VirtualFunc();

    pb = &d;
    pb->RealFunc();
    pb->VirtualFunc();


    return 0;
}

 

上一篇:【计算机二级Java语言】卷016


下一篇:漏洞学习笔记-016-利用可执行内存和.NET攻击DEP