FlyingCode

导航

 

因为平时不太常用 看C++PP的时候刷到这一部分内容,记录下来以后复习用

相关内容:

派生类构造函数要点:

1.首先创建基类对象

2.派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数

3.派生类构造函数应初始化派生类新增的数据成员

在派生类的初始化列表中通过基类的构造函数对派生类对象进行初始化是通过基类的复制构造函数完成的

因为复制构造函数传递的是引用类型,而基类可以引用派生类,所以编译器会自动将初始化后的新基类对象赋值给派生类对象,如果须要对派生类对象独有的变量进行初始化,可以在初始化列表后用逗号跟上,或者在构造函数花括号内写明

正文:

基类的指针或引用是可以指向或引用派生类的,以下都用指针来举例,引用也同样适用

指针调用非虚函数时会根据指针类型来判断使用的函数类型

说的简单点就是利用基类指针指向派生类对象时,利用该指针实现非虚函数,不管是否重载函数,都会调用基类的函数

这样就很不方便 例如一个基类指针数组,既存储既基类对象又存储派生类对象,那么在实际操作的时候会无法通过指针正确的访问派生类对象重载过的非虚函数

所以引入了虚函数的概念

指针调用虚函数时会根据指针所指向的对象类型来判断使用的函数类型

这样使用基类指针会方便很多

同时书上将基类的析构函数也定义为虚函数,何时需要这样做呢?

 

当基类对象的析构函数为非虚函数时将不会执行派生类的析构函数

如果派生类对象的析构函数执行了某些操作,例如delete释放内存,将会导致内存泄漏等情况的发生

为了防止这种意料之外的情况发生,基类必须要有一个虚析构函数,哪怕析构函数不执行任何操作,也要显示声明

 

虚函数注意事项:

1.构造函数不能是虚函数

创建派生对象时,将调用派生类的构造函数,而不是基类的构造函数,然后派生类的构造函数将使用基类的一个构造函数,这种顺序不同于继承机制,因此派生类不继承基类的构造函数,将类构造函数声明为虚函数没什么意义

2.析构函数

通常应给鸡肋提供一个虚析构函数,即使他不需要析构函数

3.友元

友元不能是虚函数,,因为友元不是类成员,只有类成员才能是虚函数,如果由于这个原因引起了设计问题,可以通过让友元函数使用虚成员函数来解决

4.没有重新定义

如果派生类没有重新定义函数,将使用该函数的基类版本,如果派生类位于派生链中,将使用最新的虚函数版本,例外的情况时基类版本是隐藏的

5.重新定义将隐藏方法

如果重新定义派生类中的函数,将不止是使用相同的函数参数列表覆盖基类声明,无论参数列表是否相同,该操作将应藏所有的同名基类方法

由此引出了两条经验规则:

第一,如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以改为指向派生类的引用或指针.这种特性被称为返回类型协变,因为允许返回类型随类类型的变化而变化,但这种例外只适用于返回值,而不适用于参数.

第二,如果基类声明被冲在了,则应在派生类中重新定义所有的基类版本,如果只重新定义部分版本,则剩余版本将被隐藏,派生类对象将无法使用它们

关于第五点的隐藏部分 书上说的不太详细,又从其他博客摘抄了点内容

原文连接:http://blog.sina.com.cn/s/blog_60e96a410100lirk.html

注意:发生覆盖的特征有:

    1) 不同的范围(分别位于派生类与基类);

    2) 函数名字相同

    3) 参数相同

    4) 基类函数必须有virtual关键字。 

   成员函数被重载的特征
  (1)相同的范围(在同一个类中);
  (2)函数名字相同;
  (3)参数不同;
  (4)virtual 关键字可有可无
  “隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下
  (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
  (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)   

 

 接下来是纯虚函数内容

纯虚函数的定义很简单,在声明后面加上 = 0即可

例如:

virtual void ViewAcc () const = 0;

当一个类中声明了纯虚函数那么这个类将被当做一个虚基类,是无法被实例化的

纯虚函数的好处就是强制让派生类遵循接口约定,覆盖所有的纯虚函数,因为如果有纯虚函数没被覆盖那么该派生类也将被当做虚基类,无法实例化

待续

posted on 2017-08-02 20:11  hhbeast  阅读(166)  评论(0)    收藏  举报