C++纯虚函数与抽象类
纯虚函数:
纯虚函数:在基类中将某一成员函数定为虚函数,并不是基类本身的需要,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。
纯虚函数是在声明虚函数时被“初始化”为0的函数。
一般形式为:
virtual 函数类型 函数名(参数列表)=0;
如:
virtual float area()const=0;
注意:
1、虚函数没有函数体;
2、最后面的“=0”并不表示函数的返回值为0,它只是起形式上的作用,告诉编译器“这是纯虚函数”;
2、这是一个声明语句,最后应有分号;
要点:
1、纯虚函数只有函数的名字,而不具有函数的功能,不能被调用。可以说他是“徒有其表,而无其实”。它只是通知编译系统:“这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可以被调用。
2、纯虚函数的作用是在基类中为其派生类保留一个函数名字,以便派生类根据需要对它定义。如果在其基类中没有保留函数名字,则无法实现多态性。
3、如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍为纯虚函数。
抽象类:
抽象类:不要来定义对象,而只作为一种基本类型用作继承类。由于经常作为基类,通常称为抽象基类。
注:
1、凡是包含纯虚函数的类都是抽象类。因为纯虚函数不能被调用,包含纯虚函数的类是无法建立对象的。
2、抽象类的作用是作为一个类族的公共基类,或者说,为一个类族提供一个公共接口。
3、如果在抽象类所派生出的新类中对基类的所有纯虚函数进行了定义,那么这些函数就被赋予了功能,可以被调用。这个派生类就不是抽象类,而是可以用来定义对象的具体类。
4、如果在派生类中没有对所有的虚函数进行定义,则此派生类仍是抽象类,不能用来定义对象。
5、不能单独调用抽象类的构造函数,仅可用于子类构造函数的初始化列表里,用于初始化子类中继承自父类的成员变量。
6、抽象类不是必须有析构函数(当为抽象类的成员指针动态分配堆内存时,要有释放堆内存的析构函数,否则就必须在子类的析构函数中删除从抽象基类继承的成员指针所指向的堆内存)。一旦抽象类有析构函数,必须定义为虚析构。(只有当抽象类的析构函数被定义为虚函数,在删除一个指向由动态分配生成的非抽象子类的抽象基类指针时才会先调用非抽象子类的析构函数对子类拓展的成员进行释放再自动调用抽象基类的析构函数对从抽象基类继承而来的成员进行释放。否则只调用抽象基类的析构函数对从抽象基类继承而来的成员进行删除,会造成内存泄露)。
7、不能以传值的方式向一个函数传递抽象基类的参数。
8、如果形参是抽象基类,实参是子类。不可以用传值。因为相当于用子类对象创建了一个抽象基类的对象,而后者是不允许的,即不允许创建抽象基类的对象。
9、 如果函数形参是抽象类,就必须以传引用或指针的方式传递参数,而不能是传值方式。否则会创建一个抽象类对象,这是不允许的。实际传递的实参只能是非抽象子类对象,返回值也只能是非抽象子类对象 不能返回抽象类对象。