一、接口的概念
1.接口:是专门用来被继承的,一个接口,可以包含一个类属性的变量、常量等内容。但是,接口中的方法不能有具体的代码。接口中的方法类似虚函数,接口也就类似于抽象类。这就意味着,接口不能被实例化,不能把程序入口放到接口中。这样设计的目的是为了实现多重继承,所以接口就出现了。
2.抽象类:只要有一个抽象方法,或者说包含虚函数的类,此类就被标记为抽象类。作为抽象类,用户不能创建此类的实例,只能创建继承它的类的实例。抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化,所谓实现,就是去定义虚函数的函数体。
3.虚函数:虚函数的定义如下,虚函数没有函数体,只有声明,后加 =0 表示此为纯虚函数。
virtual 返回值类型 函数名 (函数参数) = 0;
举例:
class Shape { public: virtual void draw() const = 0; //虚函数1,画出一个对象 virtual void error(const string &msg); //虚函数2,报告错误 int objectID() const; //返回当前对象的整型标识符 }; class Rect: public Shape { //派生类矩形 }; class Elli: public Shape { //派生类椭圆形 };
说明:
上述定义了一个抽象类Shape,draw()函数,并且由“=0”可知它是一个纯虚函数,是没有定义具体实现成员的函数,实际上,他是一个接口。error()函数,如果需要报告错误,就可以调用它。抽象类中定义的虚函数draw()告诉了其派生类要画一个对象,就只是告诉你要“画”这个动作,你咋画就管不着了,不管你是画三角形还是矩形还是五角形我都不管。而派生类Rect就是去实现draw()这个函数,它告诉我要画,然后我就去画矩形,Elli类去画椭圆形。
总结:
从说明中可以看出,draw() 虚函数就相当于一个“通用的动作”,派生类Rect和Elli只有去实现了这个“通用的动作”才知道要去画,这样我们就叫虚函数draw()为接口,而基类Shape的派生类Rect、Elli是去实现接口,上述特性实际上是面向对象的抽象类或者说虚函数的作用,这个作业其实就是,把虚函数当成接口。