C++个人学习继承多态模板的一些笔记

C++中this指针
每一个非静态成员函数指挥诞生一份函数实例,也就是说多个相同类型的对象会共用一块代码
这一块代码是如何区分那个对象调用自己的呢?
C++通过提供特殊的对象指针,this指针来解决这个问题,this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
当形参和成员变量同名时,可用this指针来区分,
在类的非静态成员函数中返回对象本身,可用return *this

成员函数后加const我们称为常函数
常函数内不可以修改成员属性
声明对象前加const称该对象为常对象
常对象只能调用常函数
成员属性声明时加上关键字mutable后,在常对象或常函数中依然可以修改

继承同名成员处理方式
当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢
   1、访问子类同名成员:直接访问即可。例如:子类.成员
   2、访问从父类继承下来的同名成员:需要加作用域。例如:子类.父类::成员
静态成员和和非静态成员同名的处理方式一致
静态成员类内声明,类外初始化。(类外初始化要加作用域)

菱形继承是有两个或多个派生类继承同一个基类,又有某一个类同时继承这个两个或多个派生类,这种称为菱形继承。
菱形继承会带来的问题:继承两个派生类的子类会有两份基类的数据,会产生二义性,而那两份或多份数据实际上只需要一份就可以了
利用虚继承可以解决这样的问题。
语法:class 子类:virtual 继承方式 基类{};//继承之前加上关键字virtual变成虚继承,最大·基类被称为虚基类
本质继承的不再是虚基类的那一份数据而是一个指针,指针指向虚基类的一份数据。
 这时虚基类的数据只有一份,它的子类都在共有这一份数据,所以就不会有二义性。

在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容
因此可以把虚函数改成纯虚函数
纯虚函数的语法:virtual 返回值类型 函数名 (参数列表)=0;
当类中有纯虚函数那么该类也称为抽象类
抽象类的特点:1、抽象类是无法实例化对象的。2、子类必须重写抽象类的纯虚函数,否则子类也属于抽象类

虚析构与纯虚析构
多态使用时,如果子类中有属性开辟到堆区的话,那么父类指针在释放时无法调用到子类的析构代码
解决的办法是将父类的析构函数改成虚析构或纯虚析构
虚析构语法:virtual ~类名(){}  
纯虚析构语法:virtual ~类名()=0;纯虚析构类内声明,类外也必须有实现:类名::~类名·(){}
虚析构和纯虚析构的共性:1、可以解决父类指针释放子类对象。2、都要有具体实现
虚析构和纯虚析构的区别:如果是纯虚析构,那么该类也属于抽象类,无法实例化对象
虚析构或纯虚析构就是用来解决通过父类指针释放子类对象
总结:如果子类中没有堆区的数据可以不写虚析构或纯虚析构

模板的语法:template<class T1,classT2>
void add(T1,T2){}//这是一个函数模板

template<class T1,classT2>
class person
{
T1  n;
T2   m;
};//这是类模板

普通函数和函数模板的区别:1、如果函数模板和普通函数都可以实现,优先调用普通函数
2、可以通过空模板参数列表来强制调用函数模板(空模板参数列表:函数名<>(参数列表);)
3、函数模板可以发生重载
4、如果函数模板可以产生更好的匹配,优先调用函数模板
总结:如果提供了函数模板最好就不要提供普通函数了,容易产生二义性

类模板和函数模板的区别:1、类模板没有自动类型推导的使用方式。
2、类模板在模板参数列表中可以有默认参数

当类模板碰到继承时,需要注意:1、当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中的T的类型
2、如果不指定,编译器无法给子类分配内存
3、如果想灵活指定出父类中的T的类型,子类也需变为类模板
语法:class 子类:继承方式 父类<T的类型>{};
注意:类模板中成员函数类外实现时,需要加上模板参数列表。才能让编译器知道这是一个类模板的成员函数

类模板成员函数分文件编写产生的问题以及解决方式
问题:类模板中的成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决方式:1、直接包含.cpp源文件
2、将声明和实现写到同一个文件中,并更改后缀名为.hpp。 hpp是约定的名称,并不是强制
主流的解决方法是第二种,把类模板的声明和实现都写到一个文件,更改后缀名为.hpp

类模板配合友元函数的类内和类外实现
全局函数类内实现--直接在类内声明友元即可
全局函数类外实现--需要提前声明类模板接着声明或实现全局函数接着实现类模板,类内的友元函数还需要加上空模板参数
如果没有特殊要求建议全局函数做类内实现。


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值