1 / 94
文档名称:

《机械设备安装工程施工及验收通用规范》GB50231-2009.doc

格式:doc   大小:10,307KB   页数:94页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

《机械设备安装工程施工及验收通用规范》GB50231-2009.doc

上传人:zxwziyou9 2018/7/8 文件大小:10.07 MB

下载得到文件列表

《机械设备安装工程施工及验收通用规范》GB50231-2009.doc

文档介绍

文档介绍:8:下列多重继承时的二义性问题如何解决?
class A{ //类A的定义
public:
void print () {cout<<"Hello, this is A"<<endl;}
};
class B{ //类B的定义
public:
void print () {cout<<"Hello, this is B"<<endl;}
};
class C : public A, public B{ //类C由类A和类B共同派生而来
public:
void disp () {print ();}//编译器无法决定采用A类中定义的版本还是B类中的版本
};
解答:若两个基类中具有同名的数据成员或成员函数,应使用成员名限定来消除二义性,如:
void disp () {
A: : print () ; //加成员名限定A::
}
但更好的办法是在类C中也定义一个同名print函数,根据需要调用A::print()还是B::print(),从而实现对基类同名函数的隐藏
9:下列公共基类导致的二义性如何解决?
class A{ //公共基类
public: //public 成员列表
void print(){
cout << "this is x in A: " <<endl;}
class B: public A{};
class C: public A{};
class D : public B, public C{};
void main(){
D d; //声明一个D类对象d
A* pa=(A*) &d; //上行转换产生二义性
() ; //print ()具有二义性,系统不知道是调用B类的还是C类的print ()函数
}
注意:把子类的指针或引用转换成基类指针或引用是上行转换,把基类指针或引用转换成子类指针或引用是下行转换。
解答:1) main函数中语句“();”编译错误,可改为以下的一种:
::print(); ::print();
若改为“::print();”又会如何呢?
由于d对象中有两个A类对象,故编译会报“基类A不明确”。
语句“A*pa=(A*)&d;”产生的二义性是由于d中含有两个基类对象A,隐式 转换时不知道让 pa指向哪个子对象,从而出错。可改为以下的一种:
A*pa=(A*)(B*)&d; //上行转换
A*pa=(A*)(C*)&d; //上行转换
事实上,使用关键字virtual将共同基类A声明为虚基类,可有效解决上述 问题。
10:下面哪种情况下,B不能隐式转换为A ( ) ? (2011 •腾讯)
A. class B:publicA{} B. classA : public B{}
C. class B {operator A();} D. class A{A(const B&);}
解答:B。因为子类包含了父类部分,所以子类可以转换为父类,但是相反, 父类没有子类额外定义的部分,所以不能转换为子类,故A正确,而B错误。
非C++内建型别A和B,在以下几种情况下B能隐式转化为A。
B公有继承自A,可以是间接继承的。
class B : public A{
};
此时若有“A a; B b;”,则“a=b;”合法。
B中有类型转换函数。
class B{
operator A();
};
此时若有“A a; B b;”,则“a=b;”合法。
A实现了非explicit的参数为B (可以有其他带默认值的参数)的构造函 数
class A {
A(const B&);
};
此时若有“A a; B b;”,则“a=b;”合法。
11:调用一成员函数时,使用动态联编的情况是()。(2011 •淘宝)


解答:B。
结合一段示例代码来看虚函数的作用,以帮助大家理解多态的意义所在。
例2:下述代码的输出结果是什么?
class base{
public:
virtual void disp(){cout << "hello, base1" <<endl;} void disp2(){cout <<"hello, base2" << endl;}
};
class child1:public base{
public:
void disp() {cout << "hello, child1" << endl;}
void disp2(){cout <<"hello, child2