抽象方法

  抽象方法(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 << "正在吃东西!\n";
}

void Pet::sleep()
{
	std::cout << name << "正在睡大觉!\n";
}

Cat::Cat(std::string theName) : Pet(theName)
{
}

void Cat::climb()
{
	std::cout << name << "正在爬树!\n";
}

void Cat::play()
{
	std::cout << name << "玩毛线球!\n";
}

Dog::Dog(std::string theName) : Pet(theName)
{
}

void Dog::bark()
{
	std::cout << name << "旺~旺~\n";
}

void Dog::play()
{
	std::cout << name << "正在追赶那只该死的猫!\n";
}

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;
}

  

posted @ 2019-02-21 14:36  耐烦不急  阅读(473)  评论(0编辑  收藏  举报