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()函数,这种表示也会造成一定的问题,如果派生类未实现继承来的虚函数,而执行了基类的缺省行为,会与实际所需目的违背而并未报错,问题不在于基类的缺省行为,而在于派生类没有表达自己所需要的执行行为
非虚函数
非虚函数的目的是让派生类继承函数接口和强制性实现
这种情况所代表的意义是不变性凌驾于特异性之上,派生类不需要添加函数的特异行为,与基类行为一致,派生类都不应该尝试改变其行为