程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
虚函数总是在派生环境中使用,用虚函数实现动态多态性的一般步骤如下:
(1)在基类中定义虚函数;
(2)在派生类中定义与基类虚函数同名、同参数、同返回类型的成员函数,即派生类中的虚函数。虽然基类中的虚函数与各派生类中虚函数同名、同参数,但由于各虚函数的函数体不同,因而可用同名虚函数在运行时完成对不同对象的操作,从而实现动态绑定。
(3)调用虚函数,其步骤如下:
②将基类对象地址或派生类对象地址赋给该指针变量。如,ptr=&基类对象;或者ptr=&派生类对象;
③用“指针变量->虚函数(实参)”方式去调用基类或派生类中的虚函数,如,ptr->虚函数(实参)。
【例7.2】分析以下程序的执行结果。
解:上述程序中,各类之间构成的类层次如图7.1所示。
图7.1 8类层次
类BaseA包括虚函数bf(),类BaseB包括非虚函数bf(),类Derived是从类BaseA和类BaseB派生的,其中也包括函数bf()。那么类Derived中函数bf()是虚函数还是非虚函数呢?实际上,它在不同的场合呈现不同的性质:若相对于类BaseA的派生路径,由于类BaseA中的bf()为虚函数,所以它是一个虚函数;若相对于类BaseB的派生路径,由于类BaseB中的bf()为非虚函数,所以此时它是一般的重载函数。程序的执行结果如下:
class BaseA
class BaseB
class Derived
class BaseB
【例7.3】设有一个作品类Art,包括作者姓名、作品名字和作品年代等私有数据成员以及输出虚函数disp()。从Art类派生出一个绘画类Paint和一个音乐类Music,在Paint类中添加高度和宽度数据成员,在Music类中添加曲调数据成员,它们都实现了虚函数display()。再由Music类派生出室内曲Chamber类,其中添加了其他曲数数据成员,并实现了虚函数display()。要求编写一个普通函数printobject()输出所有这些类的对象。
解:设计的类层次如图7.2所示,普通函数printobject()采用动态绑定的方法。因为display()设计成虚函数,所以printobject()函数使用Art&d参数。
图7.2 类层次
程序如下:(www.chuimin.cn)
本程序的执行结果如下:
输出结果:
作者:贝多芬
名字:第9交响曲
年份:1824
类型:音乐
曲调:D小调
作者:达芬奇
名字:蒙娜丽莎
年份:1503
类型:绘画
尺寸:宽度=24,高度=36
作者:莫扎特
名字:费加罗的婚礼
年份:1786
类型:音乐
曲调:D大调
其他:室内乐4首
有关C++程序设计基础教程的文章
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。按照绑定进行阶段的不同,可以分为两种不同的绑定方法:静态绑定和动态绑定,这两种绑定过程中分别对应着多态的两种实现方式。有些多态类型,其同名操作的具体对象能够在编译、连接阶段确定,通过静态绑定解决,比如重载、强制和参数多态。包含多态操作对象的确定就是通过动态绑定完成的。分析以下程序的执行结果。......
2023-11-07
文本文件的结束以ASCII码的控制字符0x1A表示。使用流成员函数读取文件数据常用的输入流成员函数有get、getline和read等。虽然给出长度参数,但当遇到文件结束标记或者文件结束时读操作结束。例如,和上例相同功能的程序如下:3.文本文件的读写示例分析以下程序的执行结果。程序的执行结果如下:His编写一个程序,将文本文件test.txt复制到文本文件real.txt。......
2023-11-07
同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。程序的一次执行如下:填充一个字符数组第1个数据:a↙第2个数据:b↙第3个数据:c↙第4个数据:d↙第5个数据:e↙数组的内容是:a b c d e填充一个双精度数组第1个数据:1.2↙第2个数据:5.6↙第3个数据:3.1↙数组的内容是:1.25.63.1图5.3类模板、模板类和对象之间的关系......
2023-11-07
内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时仍将其看作是非内联的。声明虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确地执行。如果不相同,则被派生类虚函数的参数类型强制转换为基类中虚函数的参数类型。......
2023-11-07
输入流是用流提取运算符实现的。流读取运算符通常会跳过输入流中的空格、tab键、换行符等等的空白字符。该函数读取num-1个字符后结束,或者遇到分隔符separator时结束。成员函数peek返回输入流中的下一个字符,但并不将其从输入流中删除。......
2023-11-07
相关推荐