纯虚函数
纯虚函数是只需声明,不需要定义的虚函数。
声明方式:class 类名
{
virtual 返回类型 函数名(参数列表)=0;
};
抽象类
有纯虚函数的类被称为抽象类。
抽象类无法通过构造函数直接生成对象,只能够被派生类继承。
当抽象类被继承时,该类的所有纯函数必须在子类中重写,否则子类也将称为一个抽象类。
Animal.h
#ifndef _ANIMAL_H
#define _ANIMAL_H
class Animal
{
public:
virtual void eat();
};
class Cat:public Animal
{
public:
virtual void eat();
};
#endif
Animal.cpp
#include"Animal.h"
#include <iostream>
using namespace std;
void Cat::eat()
{
cout<<"eat fish"<<endl;
}
main.cpp
#include"Animal.h"
#include <iostream>
using namespace std
int main(int arg,char **argv)
{
//Animal animal(100,5);不可以这样调用,不然出现下图报错问题
Cat cat;
cat.eat();
return 0;
}
运行结果
多态
概念:在面向对象语言中,接口的多种不同实现方式。
多态能允许将父对象设置成一个或更多个它的子对象的技术,赋值之后父对象就可以根据当前赋值给它的子对象的特性进行运作。可以简单地理解为:将基类对象的指针或引用绑定到派生类对象上,此时基类的指针或引用就可以拥有派生类的特性。
函数重写实现多态
实现多态的步骤:
第一步:派生类重写基类的虚函数。
第二步:积累的指针或引用绑定到派生类的对象上。
第三步:通过基类的指针或引用调用所绑定派生重写过的函数。
Animal.h
#ifndef _ANIMAL_H
#define _ANIMAL_H
class Animal
{
public:
virtual void eat();
};
class Cat:public Animal
{
public:
virtual void eat();
};
class Dog:public Animal
{
public:
virtual void eat();
};
#endif
Animal.cpp
#include"Animal.h"
#include <iostream>
using namespace std;
void Cat::eat()
{
cout<<"eat fish"<<endl;
}
void Dog::eat()
{
cout<<"eat meat"<<endl;
}
#include"Animal.h"
#include <iostream>
using namespace std
void animalEat(Animal* animal)
{
animal->eat();
}
int main(int arg,char **argv)
{
Dog dog;
animalEat(&dog);
Cat cat
animalEat(&cat);
return 0;
}
运行结果