1普通函数,虚函数的区别:
虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。
而对于普通函数,永远调用的是指针或者引用本身所属的类的函数
即普通函数不能实现多态
2 C++中的纯虚函数“只提供申明,没有实现”,是对子类的约束,是“接口继承”,也是一种“运行时多态”。
3 C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能实例化对象,只有实现了这个纯虚函数的子类才能实例化对象。在C++中的一种函数申明被称之为:纯虚函数(pure virtual function).它的申明格式如下:
class CShape
{
public:
virtual void Show()=0;
};
注意=0,在普通的虚函数后面加上"=0"这样就声明了一个pure virtual function.
4 虚函数为了重载和多态的需要,在基类中是有定义的(当然定义也可以为空的一个花括号{}),所以子类中可以重写也可以不写基类中的虚函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,等于java的抽象函数。
5 overload和override
override是指派生类重写基类的虚函数。重写的函数必须有一致的参数表和返回值(C++标准允许返回值不同的情况,但是很少编译器支持这个feature)。
overload是指编写一个与已有函数同名但是参数表不同的函数。例如一个函数即可以接受整型数作为参数,也可以接受浮点数作为参数。
6 基类声明的虚函数,在派生类中也是虚函数,即使不再使用virtual关键字。纯虚函数被继承后为 需要实现,所以也变成虚函数。
7 当一个类打算被用作其它类的基类时,它的析构函数必须是虚的(但是构造函数不可以为虚函数。)。否则在
A * a = new B;//B为A的子类
delete a;时只会调用A的析构函数,B的不会被调用
但是虚构函数不需要纯虚,隋然可以声明为纯虚,但是没有实际意义
8 一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。即就算父类指针指向子类对象,调用父类的构造或者析构函数时,里面涉及到的函数都将调用自身的函数,而不是子类的函数。
对比
C++虚函数 == Java普通函数
C++纯虚函数 == Java抽象函数
C++抽象类 == Java抽象类,有至少一个抽象函数(纯虚函数)
C++虚基类 == Java接口全部为抽象函数(纯虚函数)