直接声明即可,但并不能实例化。
1、抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。只要把这些东西对应到生活中的概念就明白面向对象的设计本身来源于生活,我们对事物的理解本身都是一样的哲学,理解概念之后怎么写代码就更容易掌握。
2、抽象类是表示部分地实现功能,比如把某些已经确定的功能实现了,而抽象的功能则表示未实现,因为不能确定子类用什么方式实现它或者说把可能性和机会留给子类,比如对于宠物这个抽象类"睡觉“这个方法就是抽象的,因为子类的实现方法各有差异,狗经常待在墙边阴凉处睡觉,而猫则爬到树上睡觉,我们父类中不能把这个”个性“的东西放入”共性“的父类中,“共性”是它们都会睡觉,但具体怎么睡觉则是”个性“,因此只能把它弄成抽象的,把机会留给子类来实现它。抽象类和抽象方法的目的是相同的。当子类实现这些抽象方法后就是叫”实现“,如果这个方法在父类中已经实现了不是抽象的而子类再来实现一次就是“覆盖”或“重写“了父类的方法,这2个都叫实现了”多态“特性。“多态”就是某个“共性”在各个子类中表现出不同的“个性”,但都同时保留着“共性”。
Pet[] pets = new Pet[] { new Dog(), new Cat()};
for(int i = 0;i < pets.length; i++) {
pets[i].doSleep(); // 这时每个个体的”个性“表现出现了,就是”多态“。程序是在用它们声明的”共性“ doSleep 来调用这个方法的。这里面就是用"实现”/”覆盖“/"改写”父类方法达到的。覆盖了的方法在调用时会找对应的子类的方法而不是直接用父类提供的,在这里猫会按猫的习惯睡觉,狗会按狗的习惯睡觉。
}
C++里面有抽象类的概念了,同时也有接口的概念,下面我举例说明吧。
比如我想定义动物的接口,简单起见,只有2个行为,吃和走。那么我们可以这么定义
public iAni
{
public:
virtual void eat() = 0 ;
virtual void walk() = 0 ;
}
那么上面就是一个完整的接口了。那么我们知道鱼也是动物,知道鱼走路是用尾巴游的,暂且不知道鱼是怎么吃的,那么我们可以从继承下来一个子类。
class abstract ifish: public iAni
{
public:
virtual void walk() { 用尾巴游;} ;
// 注意这里只实现了walk方法,而没有实现eat的方法
}
从行为和实体来说,ifish是抽象类,从广义上来说它也是接口,但是侠义来说,接口只是定义了对象的行为方法,比如上面的walk,eat两个函数,而不去关注里面的具体实现,比如iAni这个类。
值得注意的是,接口和抽象类都是不能实例化的,但可以定义接口和抽象指针,指向实例化的子类。
在上面IFish类中,实现了walk而没有实现eat的方法,所以IFish只能是个抽象类,不能实例化。在VC工程里面可以不用abstract关键词显示修饰。
楼上真逗啊.你说的抽象类其实指的是抽象基类吧.就是将virtual的函数在基类里将它只声明,再在后面写个=0;
比如 virtual int f()=0;
这个基类就是抽象类了.
就是类前面加个abstract关键字吧。
virtual ref