- 1
- 0
- 约3.96千字
- 约 12页
- 2016-08-21 发布于湖北
- 举报
C语言8虚函数
October Dr. Haibin Zhu 第八章 虚函数 C++中的动态联编是通过虚函数实现的,虚函数允许函数调用与函数体之间的联系在运行时才建立。 8.1 引入派生类后的对象指针 指向基类的指针可以指向其公有派生类对象 根据继承方式的概念,按公有继承的方式产生的派生类中,必然包含了原来基类中的全部成员。因此,一个公有派生类的对象可以提供其基类对象的全部行为,则在程序中可以把一个公有派生类对象当作其基类对象来处理,那么,指向基类的指针自然也可以指向其公有派生类对象。 【例】基类指针、派生类指针、基类对象和派生类对象四者间组合的使用情况示例 #include iostream.h class A { int a; public: A(int i=1) {a=i;} void print( ) {couta=aendl;} int geta( ) {return a;} }; class B:public A { int b; public: B(int j=2) {b=j;} void print( ) {coutb=bendl;} int getb( ) {return b;} }; void main() {A aa(10),*pa; B bb(20),*pb; pa=aa; pa-print(); pb=bb; pb-print(); pa=bb; pa-print(); bb.print(); coutpa-geta()endl; pb=aa; } 如改为pa-getb();则错误,因基类指针仅能看到派生类中的基类部分,而不能直接访问公有派生类中定义的成员,但可采用强制类型转换((B*)pa)-getb(); 结果: a=10 b=20 a=1 b=20 1 //基类指针可以指向基类对象 //派生指针可以指向派生类对象 //基类指针可指向它的公有派生类对象,但不许指向它的私有派生类对象。 //错误,派生类指针不可以直接指向基类对象 8.2 虚函数的定义及使用 1.虚函数的作用 上例中,虽然基类指针pa指向派生类对象bb(即pa=bb),但语句pa-print()所调用的函数仍是基类对象的print()。这是由于虽然一个基类指针可以指向其派生类对象,但指针本身的属性并没有改变,因此,系统认为它所指向的仍然是一个基类对象,于是就只能调用其基类的成员函数print()。但在派生类中已经改变了这个函数的实现,即在派生类中又定义了一个同名的print()函数,而这种改变在静态联编时编译器并不知道,以致于造成和我们期望的结果不统一。 所以,必须通知编译器这种可能的改变,即需要进行动态联编,其方法就是在基类中将可能发生改变的成员函数声明为虚函数。否则,若要调用派生类中的成员函数print(),只能采用显式的方法:bb.print(); 或采用对指针强制类型转换的方法((B*)pa)-print(); 基类用虚函数提供了一个派生类对象都具有的共同界面,派生类又各自对虚函数定义自己的具体实现,即常说的“同一接口,多种方法”。这样,使得程序既简洁又具有扩充性,并能帮助程序员处理越来越复杂的程序。 2.虚函数的定义 在基类中的成员函数原型前加上关键字virtual,其格式如下: class 类名 { …… virtual 类型 函数名(参数表); …… }; 当一个类的成员函数说明为虚函数后,就可以在该类的(直接或间接)派生类中定义与其基类虚函数原型相同的函数。这时,当用基类指针指向这些派生类对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数。也就是说,当用基类指针指向不同派生类对象时,系统会在程序运行中根据所指向对象的不同,自动选择适当的函数,从而实现了运行时的多态性。 【例】虚函数的定义与应用举例。 #include “iostream.h” class Base { public: virtual void show() { cout”base class\n”; } }; class Der1: public Base { public: void show() { cout”derived class 1 \n”; } }; class Der2: public Base { public: void show() { cout”derived class 2”; } }; void main() { Base
原创力文档

文档评论(0)