10章多重继承的问题。
一、多重继承的先后问题。
上章最后的例子是为下面讨论一个被称之为“菱形问题”作铺垫的,在j**a中没有多重继承,也许没有这种现象,c++中很容易出现。由一个基类派生出两个类出来,以后新定义一个类,并从这两个类多重继承,这样就出现菱形问题了。也就是说,基类的公有或保护成员,必然被两个派生类同时继承,这两个类同时派生一个新类时,同名成员就产生了冲突。
下面我们先从简单问题入手,先不要看结果图,考虑一下结果应该是什么。小雅当初认为三行输出的id都应为“wd8503025”,但事实不是这样。
#include
#include
using namespace std;
class cbase
class cderive2 : public cbase
class cson : public cderive2, public cderive1 ;
int main (
cson s;
= "wd8503026";
= "wd8503027";
= "wd8503025";
cout < return 0; 通过设置断点不难看出,当前实例是cbase的“孙子”,而“父亲”有2个,每个“父亲”都将“爷爷”复制了一份。如果不指定哪个“父亲”的“父亲”,默认将第一个继承的“父亲”的“父亲”当作“爷爷”。上例中先继承cderive2类,所以31行和34行的“等价于“ 二、实例地址的调查。 下面的例子是先定义一个“孙子”的实例,并将地址输出。再将这个实例的地址分别赋给cderive1和cderive2类型的指针变量,并输出指针地址。再将这2个地址分别赋给cbase的2个指针变量,并输出其地址。 大家仍然不看结果,考虑一下答案应该是什么? #include #include using namespace std; class cbase class cderive1 : public cbase ; class cderive2 : public cbase ; class cson : public cderive2, public cderive1 int main ( cson s; cout < cout < cderive1 *pd1 = s; cout < cderive2 *pd2 = s; cout < cout < cbase *pb1 = pd1; cout < cbase *pb2 = pd2; cout < //cbase *pb = s; /编译有错。 return 0; 从上例可以看出,由于2个“父亲”因而复制出2个“爷爷”,2个“爷爷”的地址也不同。 三、虚继承。 解决以上问题只要用c++的“虚继承”就可以了。“虚继承”就是在实例中,基类不管继承多少个,只复制一份。 #include #include using namespace std; class cbase /因为虚继承,cbase类在此不产生副本。 class cderive2 : virtual public cbase class cson : public cderive2, public cderive1 ; int main ( cson s; = "wd8503026"; = "wd8503027"; = "wd8503025"; cout < return 0; 因为2个“父亲”都不产生“爷爷”的副本,所以“孙子”这儿就只有一个“爷爷”的副本。 c语言程序设计 试题十。返回。一 单项选择题 共30分,每题1分 1.下列不正确的转义字符是 a b c 074 d 0 2.不是c语言提供的合法关键字是 a switch b cher c case d default 3 正确的标识符是 a a b a 2 c a.3 d a 3 4 下列字符中... 熟悉和掌握全国等考二级c的上机答题要点。1 全国计算机等级考试二级c语言上机填空题答题要点。1 试题中用 found 来提示在下一行有一个空需填写。2 填写空白时,先要将下划线删除,然后再填空。3 每个空只填写一条语句或表达式。4 不要改动程序行的顺序,更不要自行添加程序结构。2 全国计算机等级考试... 实验三。一 实验目的。1 正确使用关系表达式和逻辑表达式表示条件。2 学习分支语句if和switch的使用方法。3 进一步熟悉vc集成环境的使用方法,学习vc环境提供的调试工具。二 实验内容 包含实验要求,算法说明,源程序 运行结果截图 例2三 分析与思考 误差分析 结果分析,调试总结 mif x ...
C语言程序设计
C语言程序设计
c语言程序设计 选择结构程序设计