首页 理论教育C++程序设计基础教程:用基类指针指向派生类对象

C++程序设计基础教程:用基类指针指向派生类对象

【摘要】:需要注意的是,基类指针虽然获取了派生类对象的地址,但只能访问派生类从基类继承的成员,不能访问派生类中新增的成员,除非对基类指针强制类型转换调用派生类的成员函数。

因为派生类对象也是基类对象,所以指向派生类对象的指针可以转换为指向基类对象的指针,这种引用方式是安全的,但是用这种方式只能引用基类成员。如果试图通过基类指针引用那些只有在派生类中才有的成员,编译系统会报告错误。例如,声明一个基类A和派生类B:

class A

{…};

class B:A

{};

以下语句先定义了基类A的对象指针p和派生类B的对象b,并通过p指向b:

A*p;

B b;

p=&b

派生类对象可以由基类指针所指向,这是从派生类到基类的映射,在类层次图中是上升的,所以称之为向上映射。

例如,有以下程序:

上述程序的main函数中,p定义为指向基类A对象的指针变量,它不仅可以指向基类A对象a,也可以指向派生类对象b,并通过p->dispa()执行基类A的成员函数,但即使p指向对象b,也不能执行p->dispb()。本程序执行结果与上一个例子的结果完全相同。

为了更明确这种向上映射转换,C++提供了dynamic_cast运算符,其使用格式如下:

dynamic_cast(类型>(表达式)(www.chuimin.cn)

其功能是将“表达式”转换成“类型”指定的对象,“类型”必须是以前定义类的一个指针或引用。例如:

前面的程序中,可以把p=&b;语句改为:

p=dynamic_cast<A*>(&b);

尽管不影响程序的正确性,但这样改动后程序更加清晰。

需要注意的是,基类指针虽然获取了派生类对象的地址,但只能访问派生类从基类继承的成员,不能访问派生类中新增的成员,除非对基类指针强制类型转换调用派生类的成员函数。例如,若将上述程序中的主函数改为:

这样,程序会执行错误,但采用基类指针强制类型转换,主函数改为:

这样,程序能够正确执行,但由于a对象中没有给y成员赋值,所以第一次调用dispb()结果输出没有意义的y值。

【例6.10】编写一个程序,将大学生研究生的分数转换成对应的等级并输出。

解:设计一个学生类Stud,其中包含一个公有成员函数disp()用于将学生的分数转换成对应的等级并输出。由Stud类派生出大学生类Unstud和研究生类Grstud。对应的程序如下:

程序执行结果如下:

大明76中

刘晓华85良