C++ - 面向对象 - virtual、虚函数与纯虚函数
virtual
1、基本介绍
- virtual 让派生类重写函数,通过基类指针 / 引用调用时,执行实际对象的版本
2、演示
classAnimal{public:virtualvoidspeak(){cout<<"???"<<endl;}};classDog:publicAnimal{public:voidspeak()override{cout<<"Woof"<<endl;}};Animal*a=newAnimal();Animal*d=newDog();a->speak();d->speak();# 输出结果 ??? Woof虚函数与纯虚函数
1、基本介绍
| 维度 | 虚函数 | 纯虚函数 |
|---|---|---|
| 写法 | virtual void func() | virtual void func() = 0 |
| 是否有实现 | 必须提供 | 不提供 |
| 类能否实例化 | 能(具体类) | 不能(抽象类) |
| 派生类必须重写 | 否,不重写则用基类版本 | 是,除非派生类也想当抽象类 |
2、演示
- 虚函数
classAnimal{public:virtualvoidspeak(){cout<<"???";}};classDog:publicAnimal{public:voidspeak()override{cout<<"Woof";}};Animal*p=newDog();p->speak();- 纯虚函数
classShape{public:virtualdoublearea(intr)=0;};classCircle:publicShape{public:doublearea(intr)override{return3.14*r*r;}};3、注意事项
纯虚函数的
= 0是固定语法,没有替代写法纯虚函数也可以有实现体(?)
classAnimal{public:virtualvoidspeak()=0;};voidAnimal::speak(){cout<<"???";}classDog:publicAnimal{public:voidspeak()override{Animal::speak();}};