C++面向对象高级编程(五)

 

目录

 

成员模版

模版特化

​模版模板参数​​​

C++标准库

可变数目模板参数

auto关键字和增强型for循环

reference

虚指针和虚函数表

this指针

动态绑定

重载delete和new操作符

重载delete()和new()操作符


成员模版

成员模板在泛型编程里用得较多,为了有更好的可扩展性,以上图为例,T1往往是U1的基类,T2往往是U2的基类,可以看下面这个例子: 

 通过这种方法,只要传入的U1和U2的父类或者祖类是T1和T2,那么通过这样的方式可以实现继承和多态的巧妙利用,但反之就不行了。这样的方式在STL中用得很多。

模版特化

正如其名,模板偏化指的是模板中指定特定的数据类型,这和泛化是不同的:  当然,模板偏化也有程度之分,可以部分类型指定,称之为偏特化: 

模版模板参数

C++标准库

可变数目模板参数

 过多内容将在C++11课程中讲解,这里暂时只做介绍。

auto关键字和增强型for循环

auto容器

 for循环新的形式:pass by value是个拷贝操作,把每一位的值拷贝到elem,pass by reference传引用auto类似指针,改变原来的东西,过多内容将在C++11课程中讲解,这里暂时只做介绍

reference

reference可以看做是某个被引用变量的别名。  

虚指针和虚函数表

 如上图所示,定义了三个类,A、B和C,B继承于A,C继承于B,A中有两个虚函数,B中有一个,C中也有一个。编译器将A的对象a在内存中分配如上图所示,只有两个成员变量m_data1和m_data2,与此同时,由于A类有虚函数,编译器将给a对象分配一个空间用于保存虚函数表,这张表维护着该类的虚函数地址(动态绑定),由于A类有两个虚函数,于是a的虚函数表中有两个空间(黄蓝空间)分别指向A::vfunc1()和A::vfunc2();同样的,b是B类的一个对象,由于B类重写了A类的vfunc1()函数,所以B的虚函数表(青色部分)将指向B::vfunc1(),同时B继承了A类的vfunc2(),所以B的虚函数表(蓝色部分)将指向父类A的A::vfunc2()函数;同样的,c是C类的一个对象,由于C类重写了父类的vfunc1()函数,所以C的虚函数表(黄色部分)将指向C::vfunc1(),同时C继承了超类A的vfunc2(),所以B的虚函数表(蓝色部分)将指向A::vfunc2()函数。同时上图也用C语言代码说明了编译器底层是如何调用这些函数的,这便是面向对象继承多态的本质。

this指针

 this指针其实可以认为是指向当前对象内存地址的一个指针,如上图所示,由于基类和子类中有虚函数,this->Serialize()将动态绑定,等价于(*(this->vptr)[n])(this)。可以结合上节虚指针和虚函数表来理解,至于最后为什么这样写是正确的,下面小结将会解释。

动态绑定

 

重载delete和new操作符

     

重载delete()和new()操作符

  

发布了176 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27262727/article/details/105096280