抽象方法(abstract method,也可以称为纯虚函数)是面向对象编程技术的另一个核心概念,在设计一个多层次的类继承关系时常会用到。
把某个方法声明为一个抽象方法等于告诉编译器这个方法必不可少,但我现在(在这个基类里)还不能为它提供一个实现!
其实在之前我们已经见过一个应该被声明为抽象方法的好例子了,没错,就是 Pet::play() 方法。 为什么?
上一个例子中,现实中既不存在什么都玩的宠物,也不存在什么都能玩的游戏。
每种宠物都有它自己的玩法,而我们的应对措施是输出一条消息说宠物正在玩。
现在既然知道了抽象方法这个概念,我们就再也用不着编写那些不必要的代码了。
抽象方法的语法很简单:在声明一个虚方法的基础上,在原型的末尾加上”=0”。(告诉编译器不用浪费时间在这个类里寻找这个方法的实现!),距离如下:
#include <iostream> #include <string> class Pet { public: Pet(std::string theName); virtual void eat(); virtual void sleep(); virtual void play() = 0;//抽象方法,基类则用不着编写抽象方法的实现代码 protected: std::string name; }; class Cat : public Pet { public: Cat(std::string theName); void climb(); void play(); }; class Dog : public Pet { public: Dog(std::string theName); void bark(); void play(); }; Pet::Pet(std::string theName) { name = theName; } void Pet::eat() { std::cout << name << "正在吃东西! "; } void Pet::sleep() { std::cout << name << "正在睡大觉! "; } Cat::Cat(std::string theName) : Pet(theName) { } void Cat::climb() { std::cout << name << "正在爬树! "; } void Cat::play() { std::cout << name << "玩毛线球! "; } Dog::Dog(std::string theName) : Pet(theName) { } void Dog::bark() { std::cout << name << "旺~旺~ "; } void Dog::play() { std::cout << name << "正在追赶那只该死的猫! "; } int main() { Pet *cat = new Cat("加菲"); Pet *dog = new Dog("欧迪"); cat -> sleep(); cat -> eat(); cat -> play(); dog -> sleep(); dog -> eat(); dog -> play(); delete cat; delete dog; return 0; }