首页 > 其他分享 >对象模型 - this

对象模型 - this

时间:2024-04-15 18:11:54浏览次数:22  
标签:__ 对象 子类 模型 public vfunc1 父类 void

对象模型 - this

通过一个对象来调用一个函数,那么对象的地址就是this

虚函数的模板方法使用方式

template method

示例代码:

#pragma
#ifndef __THIS_TEMPLATE_MODEL__
#define __THIS_TEMPLATE_MODEL__

class CDocument
{
public:
virtual void Serialize();
void OnFileOpen();
private:

};

inline void CDocument::OnFileOpen() {
Serialize();
}

class CMyDoc : public CDocument
{
public:
virtual void Serialize() {};
private:

};

#endif // !__THIS_TEMPLATE_MODEL__

调用代码:

#include <iostream>
#include "this_template_model.hpp"

using namespace std;

int main() {
CMyDoc myDoc;

myDoc.OnFileOpen();
   /*
   * 子类调用者被作为this传入父类方法当中
   * CDocument::OnFileOpen(&myDoc);
   * myDoc是CMyDoc的对象.继承于CDocument,符合向上转型的动作
   * 由于this指向子类.所以调用到的是子类的虚函数而不是父类的虚函数
   */

return 0;
}

分析调用代码:

  • myDoc.OnFileOpen() -> 会走到父类的函数空间

  • 父类的函数空间当中执行了虚函数 -> 由于是虚函数,那么由子类去定义具体的实现方式 -> 会回到子类执行对应的方法 -> 通过动态绑定实现的

  • 最后回到父类执行完方法

  • 由于是调用父类的方法,所以子类被传入父类方法中.子类就是this

  • c++当中所有的成员函数都有一个隐藏的this作为参数

  • 传入之后所有的子类调用父类方法都被编译器视为( *(this -> vptr[n] (this)) -> this是一根指针

现实生活当中有很多这样的情况.上层(父类)只能定义出大纲.具体执行由子类执行,大纲当中会包含要做什么但是不会具体写明要做什么(这就是类似虚函数的概念)

对象模型(Dynamic Binding)

示例代码:

#pragma
#ifndef __VPTR_AND_VTBL__
#define __VPTR_AND_VTBL__

class A
{
public:
virtual void vfunc1();
virtual void vfunc2();
void func1();
void func2();
private:
int m_data_one, m_data_two;
};

class B : public A
{
public:
virtual void vfunc1();
void func2();
private:
int m_data_three;
};

class C : public B
{
public:
virtual void vfunc1();
void func2();
private:
int m_data_one, m_data_four;
};

#endif // !__VPTR_AND_VTBL__

调用方式:

#include <iostream>
#include "vptr_and_vtbl.hpp"

int main() {
B b;
A a = (A)b;
a.vfunc1();
/*
* 这里a是A类,且A是基类
* 所以直接调用的是A的虚函数
* 所以在汇编层面会直接call -> vfunc1()的地址
*/
A* pa = new B;
pa->vfunc1();
/*
* 这里因为指针pa是指向B的
* B继承A类
* B重写了A类的虚函数
* 那么在汇编层面.不会直接call -> vfunc1()地址 -> 而是会去找到虚指针 -> call dword ptr [edx]
* c中表示是(* p->vptr[n])(p)
*/

pa = &b;
pa->vfunc1(); // 和上面的pa->vfunc1()调用方式一致
}

注意注释的讲解

标签:__,对象,子类,模型,public,vfunc1,父类,void
From: https://www.cnblogs.com/JunkingBoy/p/18136641

相关文章

  • openGauss DB4AI-Query-模型训练和推断
    DB4AI-Query:模型训练和推断openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • openGauss DB4AI-Query-模型训练和推断
    DB4AI-Query:模型训练和推断openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执行器的优化与执行能力,获得高性能的数据库内模型训练能力。更简化的模型训练与预测流程、更高的性能表现,让开发者在更短时间内能更专注于模型的调优与数据......
  • Pytorch分类模型的训练框架
    Pytorch分类模型的训练框架PhotoDataset数据集是自己定义的数据集,数据集存放方式为:----image文件夹--------0文件夹--------------img1.jpg--------------img2.jpg--------1文件夹--------------img1.jpg--------------img2.jpg....如果是cpu训练的话,就把代码中的.cu......
  • 爆火 AI 硬件遭差评,Ai Pin 上市即翻车;Grok 推出首个多模态模型丨 RTE 开发者日报 Vol.
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • ES6对象object
    <!DOCTYPEhtml><html><head> <metacharset="utf-8"> <metaname="viewport"content="width=device-width,initial-scale=1"> <title>ES6对象object</title></head><body> <......
  • 函数对象,闭包函数及装饰器了解
    函数对象【1】定义函数对象指的是函数可以被当做数据来处理【2】可以直接被引用定义一个函数用一个新的变量名来存,用新的变量名来调用#定义一个函数defadd(x,y):returnx+y#将函数地址绑定给一个变量func=add#通过这个变量找到对应的地址,从而调用函数res......
  • LLM学习(1)——大模型简介
    1.1.1LLM的概念为了区分不同参数尺度的语言模型,研究界为大规模的PLM(例如,包含数百亿或数千亿个参数)创造了术语“大型语言模型”LLM。1.1.2LLM的能力与缩放定律LLM的能力涌现能力LLMs被正式定义为“在小型模型中不存在但在大型模型中出现的能力”,这是LLMs区别于以往PLM的最突......
  • 人工智能大模型的分类-来自智谱清言
    人工智能大模型可以根据不同的维度进行分类,以下是一些主要的分类方式:按照模型架构分类:深度神经网络(DNNs):包括多层感知机(MLPs)、卷积神经网络(CNNs)、循环神经网络(RNNs)、长短期记忆网络(LSTMs)和门控循环单元(GRUs)。Transformer模型:如BERT、GPT系列、Transformer-XL等,这些模型主要基......
  • 人工智能大模型的训练阶段和使用方式来分类
    是的,人工智能大模型也可以根据它们的训练阶段和使用方式来分类。以下是根据模型的阶段性来区分的一些类别:预训练模型:这些模型在大规模数据集上进行训练,以学习通用的特征表示。预训练可以是无监督的(如使用自编码或生成对抗网络),也可以是有监督的(如在大型标注数据集上进行训练)。......