vtrp和vtbl
○ 虚指针:
■ 对象包含虚函数数,则对象内存模型包含有一个(虚)指针,指向虚表
○ 虚表:存放虚函数的地址
○ 静态绑定:编译器生成 cal xxxx 语句l
○ 动态绑定
■ 条件
● 通过指针绑定
● 指针向上转型
● 调用虚函数
■ 编译器编译成,相当于下面的形式,p表示调用虚函数的指针
● (*(p->vtr)[n])(p)
● (* p->vptr[n])(p)
■ 实现多态的关键
○ 例子如下
clipboard(1).png
this指针
○ 虚函数的另一种用法:Template method
○ 过程
■ myDoc.OnFileOpen() 相当于 CDocument::OnFileOpen(&myDoc),&myDoc相当于this
■ 使用指针,向上转型,所以在调用虚函数Serialize()时发生动态绑定,相当于
● (*(this->vptr)[n])(this)
● 调用CMyDoc的Serial函数
○ 例子如下
clipboard.png
动态绑定的汇编解释
○ 静态绑定:call + 地址
○ 动态绑定:call + 虚表查询地址
Const
○ 定义:常成员函数:const 位于函数后面
○ 知识点
■ const object只能调用const member function
■ non-const object可以调用const member function和non-const member function
■ non-const memeber funciton可以调用const member function,反之则不行
■ 成员函数的const和non-const版本同时存在(函数重载):
● const object只能调用const版本
● non-const object只能调用non-const版本
复习new和delete表达式
○ new表达式:先分配memory,再调用ctor
■ 先调用operator new(其内部调用malloc)
■ 指针类型转换
■ 构造函数
○ delete表达式:先调用析构函数,在释放内存
■ 析构函数
■ 调用operator delete(其内部调用free)
重载operator new和operator delete
○ 重载全局operator new和operator delete,例子如下
○ 重载member operator new和operator delete,例子如下
○ 调用member operator new和delete
■ Foo* pf = new Foo
■ delete pf
○ 调用全局operator new和delete
■ Foo* pf = ::new Foo
■ ::delete pf
全局operator new和delete
member operator new和delete
重载placme new和delete
○ 重载class member operator new(), 写出多个版本,前提是每一版本的声明都必须有独特的参数,其中第一个必须是size_t,其余以new所指定的placement arguments为初值
○ 也可以重载class member operator delete,写出多个版本,但绝不会被delete调用。只有当new调用的ctor抛出exception,才调用这些重载版的operator delete()。
○ 例子,标准库中的basic_string
网友评论