抽象类是为了支持多态性的实现而存在的,什么是多态,就是父类的引用可以指向子类的对象,对于相同的消息,不同的对象会产生不同的行为。c++中实现抽象类是使用纯虚函数实现的,包含纯虚函数的类是抽象类,纯虚函数的定义如下:virtual typename func(参数)=0;如果该类是抽象类,是不可以产生对象出来的,子类必须实现抽象类的纯虚函数,如果没有实现的话,子类也是抽象类,同样不可以产生出对象的。下面看看具体怎么用。

//动物类是个抽象类
#include <iostream>

using namespace std;

class Animal
{
public:
	//普通函数
	void func1(){cout<<"Animal : func1"<<endl;};
	//虚函数
	virtual void func2(){cout<<"Animal : func2"<<endl;};
	//纯虚函数,按照如下的写法进行书写
	virtual void func3()=0;
};
//狗类,继承了抽象类动物类
#include "Animal.h"

class Dog : public Animal
{
public:
	//普通方法的重载
	void func1(){cout<<"Dog : func1"<<endl;};
	//虚函数的重载
	void func2(){cout<<"Dog : func2"<<endl;};
	//对纯虚函数的实现
	void func3(){cout<<"Dog : func3"<<endl;};
};
//测试类
#include <iostream>
#include "Dog.h"

using namespace std;

int main()
{
	//如果Dog不实现父类的func3方法也是抽象的,是不可以被创建出对象的
	Dog d;

	//虚函数的不同是用在指针对象的时候
	Animal * animal;
	Dog * dog = new Dog();

	//这个就叫父类的引用指向子类的对象吧(java的说法),c++是父类的指针指向子类的对象吧
	animal = dog;

	//func1在dog中是普通方法的重载,所以animal调用的还是自己的方法
	animal->func1();

	//func2在dog中是虚函数的重载,这里就体现出了什么叫做虚函数了,为什么我们要用虚函数了
	//虚函数和普通函数的不同体现在指针将要调用的方法不是指针类型的方法,也就是说不是指针类型Animal的
	//func2方法,而是指针animal指向的对象dog的方法func2
	animal->func2();

	//dog实现了animal的纯虚函数,当然是调用dog的了
	animal->func3();

	return 0;
}

c++中的抽象类

上边的代码最好对父类加一个虚析构函数,这样当父类的指针指向了子类的对象,需要析构的时候,会调用子类的析构函数,然后调用父类的析构函数,这样就有效的防止了内存泄露!

那么什么又是接口呢,如果从语法上来说接口就是只包含纯虚函数的类,c++是没有一个关键字来表示接口的概念的,实现的时候你只需要把所有的函数都写成纯虚函数的形式,里边最好不要包含成员变量。如果是从语义上来说,抽象类用来抽象自然界一些具有相似性质和行为的对象。而接口用来抽象行为的标准和规范,用来告诉接口的实现者必要按照某种规范去完成某个功能,抽象类包括性质和行为,而接口只包含行为。比如动物类是一个抽象类,包含了所有动物共有的属性和方法,他把动物的共同特征给抽象了出来。而有些动物会飞,有些会跑,这个就是接口,他不是所有动物的共同属性,会飞的动物继承这个接口,就要实现他里边的方法,接口就是某种功能的一种抽象。