banner

8-6 抽象类举例。

这个程序是由例 8-4 改进而来。在基类 Base1 中将成员 display()声明为纯虚函数,这样,基类 Base1 就是一个抽象类。我们无法定义 Base1 类的对象,但是可以定义 Base1 类的指针和引用。Base1 类经过公有派生产生了 Base2 类,Base2 类作为新的基类又派生出D erived 类。使用抽象基类 Base1 类型的指针,当它指向某个派生类的对象时,就可以通过它访问该对象的虚成员函数。关于本例中介绍的抽象类和纯虚函数的UML 图形表示如图 8-4所示。

tips

图 8 4 抽象类和纯虚函数的UML 图形表示

源程序:
中申请的空间200个浮点数

cout<<”释放派生类所申请的内存空间:200个浮点数”<<endl;

}

在上面的实现代码中,派生类的构造函数调用了基本类的构造函数,但它并不知道基本类中是否申请过内存空间。因此,在派生类的析构函数中只负责释放它自己申请的内存空间。下面是测试代码:

void main()

{

DerivedClass x;

}

测试代码很简单,仅仅创建了一个派生类对象。在派生类对象生命期结束前,会调用其析构函数,释放 m_p2 指向的内存空间,但 m_p1 指向的内存空间会不会被释放呢?我们来看看运行结果。运行结果如下:

基存取器。

8.5 实现成员函数

对于您声明的每个类成员函数,都必须进行定义。

成员函数的定义以类名打头,然后是作用域解析运算符(::)和函数名,如下所示:

类函数与常规函数类似,也可以接受参数并返回值。

在程序清单8.1中,程序Tricycle定义并使用了Tricycle类。

程序清单 8.1 Tricycle.cpp 的完整源代码

这个程序创建了一个Tricycle对象,将其speed设置为0,然后调用成员函数pedal()和brake()多次。这些函数分别提高和降低速度。该程序的输出如下:

第3~1