格式:virtual 返回类型 函数名 (参数表)=0;
该函数赋值为0,表示没有实现定义。在基类中定义为0,在派生类中实现各自的版本。
含有纯虚函数的基类是不能用来定义对象的。纯虚函数没有实现部分,不能产生对象,其实现依赖于不同的派生类。
所有含有纯虚函数的类都是抽象类。
1.定义纯虚函数时,不能定义纯虚函数的实现部分。(其实有争议,可以定义,但无意义,程序永远无法运行到定义的位置)即使是函数体为空也不可以,函数体为空就可以执行,只是什么也不做就返回。而纯虚函数不能调用。
#include <iostream> using namespace std; class A { public: virtual void fun() = 0; }; class B : public A { void fun() {cout<<"this is B::fun()"<<endl;} }; void F(A *a) { a->fun(); } int main() { B b; F(&b); return 0; }
即使加上定义也不会报错,只是永远不会走到:
#include <iostream> using namespace std; class A { public: virtual void fun() = 0 {cout<<"this is A::fun()"<<endl;} }; class B : public A { void fun() {cout<<"this is B::fun()"<<endl;} }; void F(A *a) { a->fun(); } int main() { B b; F(&b); return 0; }
2.“=0”表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0”本质上是将指向函数体的指针定为NULL。
3.在派生类中必须有重新定义的纯虚函数的函数体,这样的派生类才能用来定义对象。(必须把所有的纯虚函数都实现)
纯虚函数与抽象类的关系:
抽象类中至少有一个纯虚函数。
如果抽象类中的派生类没有为基类的纯虚函数定义实现版本,那么它仍然是抽象类,相反,定义了纯虚函数的实现版本的派生类称为具体类。
抽象类在C++中有以下特点:
1.抽象类只能作为其他类的基类;
2.抽象类不能建立对象;
3.抽象类不能用作参数类型、参数返回类型或显示类型转换
抽象基类:
含有纯虚函数的类称为抽象类,抽象类负责接口的定义,而后续的其他类可以覆盖该接口。
这种类不能声明对象,只是作为基类为派生类服务。
抽象类的作用:
抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作。所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些语义,也可以再将这些语义传给自己的子类。