接口(抽象类)
接口描述了类的行为和功能,而不需要完成类的特定实现。C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的。
设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。
抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。
因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。可用于实例化对象的类被称为具体类。
根据概念我们来写个实例来说明抽象类。
还是以狗类为说明,例程与 2.2.4 小节类似,只是 Aninmal 类的 run()方法定义为纯虚函数,纯虚函数不用实现,由派生类 Dog 和 Cat 类实现重写即可。
新建一个目录 11_abstract_class,编辑一个 11_abstract_class.cpp 内容如下。
1 #include <iostream>
2
3 using namespace std;
4
5 /* 定义一个动物类 */
6 class Animal
7 {
8 public:
9 virtual void run() = 0;
10 };
11
12 /* 定义一个狗类,并继承动物类 */
13 class Dog : public Animal
14 {
15 public:
16 void run() {
17 cout<<"Dog 的 run()方法"<<endl;
18 }
19
20 };
21
22 /* 定义一个猫类,并继承动物类 */
23 class Cat : public Animal
24 {
25 public:
26 void run() {
27 cout<<"Cat 的 run()方法"<<endl;
28 }
29
30 };
31
32 int main()
33 {
34 /* 实例化 dog 对象 */
35 Dog dog;
36
37 /* 实例化 cat 对象 */
38 Cat cat;
39
40 /* dog 调用 run()方法 */
41 dog.run();
42
43 /* cat 调用 run()方法 */
44 cat.run();
45
46 return 0;
47 }
执行下面指令进行程序编译。
g++ 11_abstract_class.cpp -o 11_abstract_class
程序运行的结果如下。
虽然结果和例程与 2.2.4 小节一样,但是却表现了两种不同的思想。学 C++重要的是思想,当我们对这种思想有一种的了解后,不管是 Qt 或者其他 C++程序,我们都能快速学习和了解。
C++的内容就到此结束了。在这个 C++基础中,我们的例子非常简单,也十分之易懂,重要的是理解概念,许多 C++的课程都是以 C++的功能甚至是很复杂的算法作讲解,内容复杂且多。
只要我们理解好上面的 C++的基础,对学习 C++有很大的帮助,不要求对 C++有很深的理解,至少在我们后面学习 Qt 时已经大概了解 Qt 中的 C++语法。