虚函数和抽象基类
在类的继承体系中,我们希望某些函数在不同的派生类中有不同的实现, 这种函数在基类中被声明为虚函数,用关键字virtual来修饰
Class duck{
public:
…
virtual void fly();
…
};
假设我们有一个继承体系表征了所有的鸭类,基类duck(鸭子)中有函数fly(飞),我们希望不同种类的鸭子有不一样的飞行方式,便在基类duck()中把函数fly()声明为虚函数。
通过对基类虚函数的覆盖实现函数的多种实现
虚函数可以被派生类覆盖,派生类中覆盖基类实现的函数使用override关键字修饰。
Class foxduck:public duck
{
public:
…
void fly()override;
…
};
注意:
1、只有虚函数才能被覆盖,在派生类中对基类中的非虚函数进行覆盖操作是不被允许的。
2、虚函数在派生类中仍为虚函数,直到被关键字final修饰,在这之后也不能被覆盖。
3、对虚函数进行覆盖操作需要与被覆盖函数有相同的id(函数名、返回值、形参列表),其中返回值为类本身的指针时可以不一致(基类返回基类指针,派生类返回派生类指针)。
- 纯虚函数:
如同动物种类数不胜数,但不会有种名为“动物”的动物,有些类也只是表征派生类的共同特征,它不会被实现为一个实际的对象,这样的基类被称为“抽象基类”。
抽象基类中的虚函数也是一样,是纯粹为了“被覆盖”而存在的(为派生类提供接口)。
这样的虚函数称为“纯虚函数”,在声明时有如下形式:
Class duck{
public:
…
virtual void fly()=0;
…
};
这样的函数可以有定义(可以有,就是说一般没有),但是不能在”=0“的情形下在类的声明中带上函数体。