从C到Cpp——十七、抽象基类

一、什么是抽象基类

在十五章中,我们通过Student基类派生出了CS_Student继承类。其逻辑在于所有大学生都有具体专业,不能用一个宽泛的Student类来处理,而应该设计具体的类来处理。

但这样一来,Student类就不用创建任何对象了,因为宽泛化的Student类对象对于拥有具体专业的大学生对象没有意义!然而,C++仍然允许Student对象被创建。

C++中还有一种基类,它不允许自己被创建具体的对象,但它的派生类可以被创建对象。这种基类被称为抽象基类

如果把Student设置为抽象基类,那么就不允许创建Student对象,只能派生出各种各样的Student子类,比如CS_Student、EE_Student、ME_Student等等,然后创建派生类的对象。

此时,抽象基类Student的指针仍然可以指向派生类的对象。所以,可以创建Student指针数组,来管理不同的子类对象。具体的,用一个Student类指针数组,管理不同专业的学生对象所组成的集合。

同时,这种性质也可以被用于创建Linklist、Stack、Tree等抽象数据结构!

二、如何创建抽象基类?

抽象基类的创建的方法是在类的公有部分中声明纯虚函数

1--声明纯虚函数

纯虚函数是一种可以空有形式而没有具体定义的虚函数。在函数声明的后面加上=0可以将函数定义为纯虚函数。

class Student
{
    ......
    void set_grade()=0;
}

2--纯虚函数可以没有定义

下面这段代码也是可以运行的,虽然Student类变成一个抽象基类而不能被创建对象。

#include <iostream>

class Student
{
	private:
		int age;
	public:
		Student():age(19)
		{
			
		}
		virtual void set_grade()=0;
};

int main(void)
{
	
} 

3--必须在子类中声明纯虚函数的定义

在子类中完成对基类中纯虚函数的定义,否则子类无法被定义!而且这个定义的参数特征必须和基类中声明的纯虚函数一样!

下面这段代码不得运行:

#include <iostream>

class Student
{
	private:
		int age;
	public:
		Student():age(19)
		{
			
		}
		virtual void set(int,int)=0;
};

class CS_Student:public Student
{
	private:
		int DM;
		int DS;
	public:

};

int main(void)
{
	CS_Student a;
} 

必须在派生类的公有部分加上这一段才行:

void set(int a,int b)
{
	DM=a;
	DS=b;
}

4--纯虚函数也可以有定义

纯虚函数虽然可以定义,但其定义是没有意义的。一般来说,由于基类对象不会被创建,也就不会有对象使用这个纯虚函数。

5--虚方法和纯虚函数的一个区别:

虚函数中,下面的操作是允许的:

#include <iostream>

class Student
{
	private:
		int age;
	public:
		Student():age(19)
		{
			
		}
		virtual void set_age(int num);
};

class CS_Student:public Student
{
	private:
		int DM;
		int DS;
};

int main(void)
{
	Student* a=new CS_Student;
	a->set_age(20);
} 

void Student::set_age(int num)
{
	age=num;
}

尽管set_age函数被声明为虚,而a是Student类型的指针,a->set_age(20)应该调用纯虚函数中的方法,但由于派生类中set_age没有被定义,最终函数还是调用了基类的方法。

但如果set_age是纯虚函数,这种操作就不得行,因为纯虚函数不得独立存在!必须在派生类中有同样的定义!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值