C++纯虚函数,非纯虚函数,非虚函数

先定义一个类

class Shape{
public:
    virtual draw() const = 0;   //纯虚函数
    virtual color();    //非纯虚函数
    int objectID();   //非虚函数
    、、、
}
class Rectangle: public Shape{}
class Ellipse: public Shape{}

纯虚函数(pure virtual function)

纯虚函数的目的是让派生类只继承函数接口,具体的实现留给派生类
纯虚函数最突出的特性:

它的派生类必须继承它的声明,有纯虚函数的类为抽象类
一般在抽象类它不会提供自身的定义

注意:它可以提供但是一般不提供,也就是说Shape::draw可以提供一份实现代码,但调用它只能显示指明类名称

Shape* p1 = new Shape; //Error, Shape是抽象的
Shape* p2 = new Rectangle; //Right
p2->draw();             //调用Rectangle::draw
p2->Shape::draw();      //调用Shape::draw

非纯虚函数(impure virtual function)

非纯虚函数的目的是让派生类继承函数接口和缺省实现
拿上面的Shape类来说,派生类必须支持一个color()函数,如果派生类并未给定,可以直接使用基类缺省的color()函数,上面的例子就是Shape::color()函数,这种表示也会造成一定的问题,如果派生类未实现继承来的虚函数,而执行了基类的缺省行为,会与实际所需目的违背而并未报错,问题不在于基类的缺省行为,而在于派生类没有表达自己所需要的执行行为

非虚函数

非虚函数的目的是让派生类继承函数接口和强制性实现
这种情况所代表的意义是不变性凌驾于特异性之上,派生类不需要添加函数的特异行为,与基类行为一致,派生类都不应该尝试改变其行为