虚函数、纯虚函数、普通函数、虚析构函数

虚函数:

  • 实现运行时多态,父类中提供虚函数的实现,为子类提供默认的函数实现。子类可以重写父类的虚函数实现子类的特殊化。
  • 当将基类中的某一成员函数申明为虚函数后,子类中的同名函数自动成为虚函数。
  • 定义一个函数为虚函数,不是说这个函数在基类中不被实现,只是为了运行时多态,运用基类的指针来调用子类中的相应函数
  • 虚函数,它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。
  • 虚函数只能借助于指针或者引用来达到多态的效果。
  • 友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

 

纯虚函数:

  • 定义一个函数为纯虚函数,代表一个函数没有被实现,为了实现一个接口,起到一个规范的作用,规范继承这个类的子类必须实现这个函数。
  • 包含纯虚函数的类是抽象类,抽象类不能用new实例化对象,必须实现了这个纯虚函数的子类才能实例化对象,没有实现纯虚函数的子类仍然是抽象类。纯虚函数“只提供声明,不提供实现”,是对子类的约束,是接口继承。
  • 纯虚函数也是一种运行时多态。
  • 抽象类是不能实例化对象的,但是可以定义抽象类的引用和指针。
  • 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0"
  • 为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
  • 在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
  • 纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
  • 抽象类的作用:抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以抽象类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。
  • 抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。
  • 抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。

普通函数:

  • 静态编译的,没有运行时多态,只会根据指针或者引用的“字面值“类对象,调用自己的普通函数;
  • 普通函数是父类为子类提供的“强制实现”。因此,在继承关系中,子类不应该重写父类的普通函数,因为函数的调用的类对象”字面值“有关。
  • 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
  • 纯虚函数的意义,让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的缺省实现。所以类纯虚函数的声明就是在告诉子类的设计者,"你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它"。

虚析构函数:

  • 防止内存泄露,派生类中申请了内存,并在析构函数中释放。假设基类的析构函数不是虚析构函数,当删除基类指针指向子类对象时就不会触发动态绑定,只调用基类的析构函数,不会调用子类的析构函数,子类中的内存得不到释放从而产生内存泄露。

其他

静态成员函数实现隐藏,当前文件可见,出了这个文件就不可见了,所以多个文件可以定义相同的名字。出了作用域之后不销毁,程序结束才销毁。静态成员函数不属于对象,它与任何对象都是无关的,因此静态成员函数没有this指针。也就是说:非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员。因为静态数据成员同样属于类的,可以直接引用。 并不是绝对不能访问本类中的非静态成员,只是不能进行默认访问,因此无法知道应该去找哪个对象,如果非要引用本类中的非静态成员,应该加对象和成员运算符“.”。  例如:cout<<a.width<<endl;

静态成员变量除了隐藏,每个对象共有,内存中只保存一份,初始化必须在类体外去进行初始化。

不可继承的类

1、将基类的构造函数设置成private,然后protected继承,这样子类就不能访问父类的构造函数,不能像正常类那样去实例化对象。

2、或者类似于单例模式,定义一个静态函数或者友元函数来生成类的实例。将基类构造函数、析构函数设置为private, 在基类里面声明friend 类,

虚继承

为了消除菱形继承的二义性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值