C++的问题和c 多重继承 二义性性有关吧

C++选择题关于多继承二义性的描述,( )是错误的。•A. 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性•B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性•C. 解决二义性最常用的方法是作用域运算符对成员进行限定•D. 派生类和它的基类中出现同名函数时,将可能出现二义性•多继承派生类构造函数构造对象时,( )被最先调用。•A.派生类自己的构造函数 B.虚基类的构造函数•C.非虚基类的构造函数 D.派生类中子对象类的构造函数C++类体系中,能被派生类继承的是( )。•A.构造函数 B.虚函数 C.析构函数 D.友元函数第一题和第二题最好能有一些解释 谢谢非常感谢
有才の牯摶
多继承是如下情况,有ABC三个类,C是如下继承的,class C : public A,public B
如果AB中都有函数f,则在C中调用f,会不知道调用的是哪个类中的。
D的意思是AB两个类,B继承自A,显然AB中可以有重名的函数2 B 这个直接写个例子就知道了。#include class A{public: A(){cout<<"A"<<}};class B{public: B(){cout<<"B"<<}};class C:public A,virtual public B{ };int main(){Creturn 0;}3B虚函数就是用来被派生类实现的。
为您推荐:
扫描下载二维码C++类的多重继承的二义性有关问题 - C++当前位置:& &&&C++类的多重继承的二义性有关问题C++类的多重继承的二义性有关问题&&网友分享于:&&浏览:7次C++类的多重继承的二义性问题我现在又四个类ABCD,继承关系如下:A 是基类, B 和 D 是 A 的公共派生类, C 是 B 的公共派生类我现在想让D能够使用C的protected方法,应该如何修改代码?------解决方案--------------------
叔叔和侄子之间没那么亲的血缘关系了。当然除非你强制给他们用friend。
------解决方案--------------------
给他们的关系搞成friend就可以解决了
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有关于C++二义性的问题,帮我解释下这段代码吧~ #include&iostream& using_百度知道
关于C++二义性的问题,帮我解释下这段代码吧~ #include&iostream& using
D,int j);virfun(),virfun是私有的成员函数;;n&}int main(){ D *pd=new D;B;}private?不明白定义成了私有程序函数?这样的话.&#92。虚函数这么强大吗;n&class B{public,帮我解释下这段代码吧~#include&}在D中;&&class D:;;} virtual void virfun() {
cout&iostream&gt,不是破坏了封装性吗:: }; fun(pd); }private:public B{using namespace std:virfun()called,还能访问到D中的vir: D(){} D(int i: B(){} B(int i){b=i: int b,是怎么访问到D中的virfun的呢; }};&void fun(B *obj){ obj-&&quot:virfun()called.&#92:B(i){d=j; void virfun() {
cout&lt关于C++二义性的问题
提问者采纳
另外,某些语言如c#则会在编译期报错,如果一定要访问私有函数c++的虚函数机制是一个简单的虚函数表,私有的虚函数本身就和多态性的初衷矛盾,c++作为偏底层的语言,从设计的角度来说,方法多的是,所以通过编译。从某种意义上来说,是不合理的设计。这样虚函数表的结构简单。不知道这样说你能否接受,编译器效率提高而且最终程序可能更高效,类设计者不应该定义这类东西,你也可以认为是c++的缺陷,运行时就可以绕过这个限制,是无论如何都无法避免的,不差这一个,没有记录权限信息。从另外一个角度来说
提问者评价
太给力了,你的回答完美地解决了我的问题,非常感谢!
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
<div style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: font-size: 14 line-height:"
>  二义性问题  一般说来,在派生类中对基类成员的访问应该是唯一的,但是,由于多继承情况下,可能造成对基类中某成员的访问出现了不唯一的情况,则称为对基类成员访问的二义性问题。  实际上,在上例已经出现过这一问题,回忆一下上例中,派生类A的两基类B1和B2中都有一个成员函数print()。如果在派生类中访问print()函数,到底是哪一个基类的呢?于是出现了二义性。但是在上例中解决了这个问题,其办法是通过作用域运算符::进行了限定。如果不加以限定,则会出现二义性问题。  下面再举一个简单的例子,对二义性问题进行深入讨论。例如:<td style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: font-size: 12 line-height:"
>class A{public:void f();};class B{public:void f();void g();};class C : public A, public B{public:void g();void h();};  如果定义一个类C的对象c1:   C c1;  则对函数f()的访问   c1.f();  便具有二义性:是访问类A中的f(),还是访问类B中的f()呢?  解决的方法可用前面用过的成员名限定法来消除二义性,例如:   c1.A::f();  或者   c1.B::f();  但是,最好的解决办法是在类C中定义一个同名成员f(),类C中的f()再根据需要来决定调用A::f(),还是B::f(),还是两者皆有,这样,c1.f()将调用C::f()。  同样地,类C中成员函数调用f()也会出现二义性问题。例如:  viod C::h()   {    f();   }  这里有二义性问题,该函数应修改为:   void C::h()   {    A::f();   }  或者   void C::h()   {    B::f();   }  或者   void C::f()   {    A::f();    B::f();   }  另外,在前例中,类B中有一个成员函数g(),类C中也有一个成员函数g()。这时,   c1.g();  不存在二义性,它是指C::g(),而不是指B::g()。因为这两个g()函数,一个出现在基类B,一个出现在派生类C,规定派生类的成员将支配基类中的同名成员。因此,上例中类C中的g()支配类B中的g(),不存在二义性,可选择支配者的那个名字。  当一个派生类从多个基类派生类,而这些基类又有一个共同的基类,则对该基类中说明的成员进行访问时,也可能会出现二义性。例如:<td style="font-family: A word-wrap: break- word-break: break- visibility: visible !imp zoom: 1 !imp filter: font-size: 12 line-height:"
>class A{public:};class B1 : public A{private:int b1;};class B2 : public A{private:int b2;};class C : public B1, public B2{public:int f();private:};  已知:C c1;  下面的两个访问都有二义性:  c1.a;  c1.A::a;  而下面的两个访问是正确的:  c1.B1::a;  c1.B2::a;  类C的成员函数f()用如下定义可以消除二义性:  int C::f()   {    retrun B1::a + B2::a;   }  由于二义性的原因,一个类不可以从同一个类中直接继承一次以上,例如:  class A : public B, public B   {    …   }  这是错误的
阅读(2333)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_082',
blogTitle:'C++多继承的二义性',
blogAbstract:'多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。  多继承下派生类的定义格式如下:  class &派生类名&:&继承方式1&&基类名1&,&继承方式2&&基类名2&,…   {    &派生类类体&   };  其中,&继承方式1&,&继承方式2&,…是三种继承方式:public、private、protected之一。例如:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 发现二义性的名称 的文章

 

随机推荐