一,纯虚函数;
1,在C++中引入了纯虚函数来定义一个公共的接口函数,定义一个接口。
1)语法: virtual 函数声明 =0;
2),纯虚函数使得基类成为抽象类,抽象类也就是只能被继承用以提供一个接口,而不能被实例化的类。
3),如果基类中有一个类被声明为纯虚函数,那么V-Table就不完整;
对于纯虚函数,V-Table只会为其留出空间但是上面没有其地址。这也就决定了抽象类无法实例化!
4), 但是对于在C++中而言纯虚函数可以被定义,这种设计是为了让一些在以后的方法中重复的代码能够被提取出来。
同时也更好的支持从虚函数到纯虚函数的改变。
2,纯虚函数的设计理念---OOP设计。关系;
纯虚函数对应的一个纯虚类,事实上是在设计的过程中,当某些事物并不是一种实际的物体而是人们意识中的一种抽象的形态;
例如,你想设计一个编辑器,他可以进行绘制各种形状。圆形,方形等等。但是这个当中显然形状就是一种抽象的东西!
C++中关于这方面的设计跟JAVA中的区别可以参考下面:
http://www.xxlinux.com/linux/article/development/soft/20060729/3177.html
二,重写VS隐藏;
在C++中严格的规定对于虚函数以及相应的动态绑定的语法要求:
首先,想实现重写的话,基类中必须声明是virtual;
其次,派生类中重写时候,其参数列表,返回类型,函数名都必须相同!(对于参数类型有特殊例子。)
否则的话,编译器就无法支持向上类型转化中的动态绑定!如果函数名相同且不满足重写的话,那么就是被隐藏了!
特殊情况:
如果说在派生类中重写虚函数的时候返回的类型是基类当中返回类型的派生类的时候,那么此时编译器是允许的!
而且!这个过程中也应该尽量的按照确定的类型去返回,否则如果单纯的遵守语法规定而按照基类中的返回类型的话,反而得不到正确的类型,还需要向下转化!
实例:见 C++编程思想第一卷15章 P373页!
三,虚函数与构造函数;虚函数与析构函数。
1,构造函数;
1)对于构造函数而言,他的任务就是保证顺利的创建这个类。因此在继承层次中,顺利的调用基类函数的构造函数以及顺利的初始化组合对象是构造函数进入其函数体必须做的一件事;
同时如果类中存在虚函数,从上一节中我们已经了解到了,虚函数VPTR是由构造函数初始化的;
显然在这个过程是发生在构造函数体前,因此他的V-Table就是当地的版本;
2)构造函数不能为虚函数,也不能支持虚机制!
如果支持的话,那么通过动态绑定在构造函数中就访问子类中的函数版本,但是子类都还未被创建。因此显然是不行的!
2,析构函数;
1)如果类中有虚函数的话那么,应该将析构函数显示的表示成虚函数。因为如果通过动态绑定的过程,由基类指针访问派生类的函数,而在delete这个指针的时候显然只能调用基类的析构函数。如果不是虚函数的话那么就无法释放刚才这个过程中new出来的派生类的对象。将会导致memory leak!
2)析构函数中同样不能支持虚机制。那样有可能导致去调用一个已经被delete的对象.
1,在C++中引入了纯虚函数来定义一个公共的接口函数,定义一个接口。
1)语法: virtual 函数声明 =0;
2),纯虚函数使得基类成为抽象类,抽象类也就是只能被继承用以提供一个接口,而不能被实例化的类。
3),如果基类中有一个类被声明为纯虚函数,那么V-Table就不完整;
对于纯虚函数,V-Table只会为其留出空间但是上面没有其地址。这也就决定了抽象类无法实例化!
4), 但是对于在C++中而言纯虚函数可以被定义,这种设计是为了让一些在以后的方法中重复的代码能够被提取出来。
同时也更好的支持从虚函数到纯虚函数的改变。
2,纯虚函数的设计理念---OOP设计。关系;
纯虚函数对应的一个纯虚类,事实上是在设计的过程中,当某些事物并不是一种实际的物体而是人们意识中的一种抽象的形态;
例如,你想设计一个编辑器,他可以进行绘制各种形状。圆形,方形等等。但是这个当中显然形状就是一种抽象的东西!
C++中关于这方面的设计跟JAVA中的区别可以参考下面:
http://www.xxlinux.com/linux/article/development/soft/20060729/3177.html
二,重写VS隐藏;
在C++中严格的规定对于虚函数以及相应的动态绑定的语法要求:
首先,想实现重写的话,基类中必须声明是virtual;
其次,派生类中重写时候,其参数列表,返回类型,函数名都必须相同!(对于参数类型有特殊例子。)
否则的话,编译器就无法支持向上类型转化中的动态绑定!如果函数名相同且不满足重写的话,那么就是被隐藏了!
特殊情况:
如果说在派生类中重写虚函数的时候返回的类型是基类当中返回类型的派生类的时候,那么此时编译器是允许的!
而且!这个过程中也应该尽量的按照确定的类型去返回,否则如果单纯的遵守语法规定而按照基类中的返回类型的话,反而得不到正确的类型,还需要向下转化!
实例:见 C++编程思想第一卷15章 P373页!
三,虚函数与构造函数;虚函数与析构函数。
1,构造函数;
1)对于构造函数而言,他的任务就是保证顺利的创建这个类。因此在继承层次中,顺利的调用基类函数的构造函数以及顺利的初始化组合对象是构造函数进入其函数体必须做的一件事;
同时如果类中存在虚函数,从上一节中我们已经了解到了,虚函数VPTR是由构造函数初始化的;
显然在这个过程是发生在构造函数体前,因此他的V-Table就是当地的版本;
2)构造函数不能为虚函数,也不能支持虚机制!
如果支持的话,那么通过动态绑定在构造函数中就访问子类中的函数版本,但是子类都还未被创建。因此显然是不行的!
2,析构函数;
1)如果类中有虚函数的话那么,应该将析构函数显示的表示成虚函数。因为如果通过动态绑定的过程,由基类指针访问派生类的函数,而在delete这个指针的时候显然只能调用基类的析构函数。如果不是虚函数的话那么就无法释放刚才这个过程中new出来的派生类的对象。将会导致memory leak!
2)析构函数中同样不能支持虚机制。那样有可能导致去调用一个已经被delete的对象.