class base
{public :
virtual void vf1 ( ) ;
virtual void vf2 ( ) ;
virtual void vf3 ( ) ;
void f ( ) ;
} ;
class derived : public base
{
public :
void vf1 ( ) ; // 虚函数
void vf2 ( int ) ; // 重载,参数不同,虚特性丢失
char vf3 ( ); // error,仅返回类型不同
voidf ( ); // 非虚函数重载
} ;
void g ( )
{
derived d ;
base * bp = & d ; // 基类指针指向派生类对象
bp-> vf1 ( ) ; // 调用 deriver :: vf1 ( )
bp -> vf2 ( ) ; // 调用 base :: vf2 ( )
bp -> f ( ) ; // 调用 base :: f ( )
};
构造函数不能是虚函数。建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数。
析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象。
纯虚函数和抽象类:
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。纯虚函数如果在基类中没有定义,那么要求派生类都定义自己的版本。纯虚函数为各派生类提供一个公共界面。一个具有纯虚函数的基类称为抽象类。
纯虚函数说明形式: virtual 类型 函数名(参数表)=0;
class shape ; // 抽象类
{
...
public:
virtual void rotate ( int ) = 0 ; // 纯虚函数
virtual void draw ( ) = 0 ; // 纯虚函数
};
抽象类不可以建立对象,不能作为函数返回类型,不能作为传值参数类型,但是可以声明抽象类的指针,可以声明抽象类的引用。