对象模型 - 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
调用代码:
#include <iostream>
#include "this_template_model.hpp"
using namespace std;
int main() {
CMyDoc myDoc;
myDoc.OnFileOpen();
分析调用代码:
-
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
调用方式:
#include <iostream>
#include "vptr_and_vtbl.hpp"
int main() {
B b;
A a = (A)b;
a.vfunc1();
注意注释的讲解