2011-04-17 44 views
-1

我试图解决以下测验。标有蓝色的答案是正确的,标有红色的答案是错误的。据我,如果任何一个类的派生保护然后一路下行的内容不能被访问的层次,但我不知道为什么的答案是错误的。问题解决中的一个继承测验

这里是测验: enter image description here 对于X,Y和Z,下列组合是什么类型的成员的类A和B都在类直接访问D.Fill一个检查可访问性和非可访问性。 下面是我的解决办法, enter image description here

红色的答案是不正确。下面是我的解释,

private/public/private: 
As D is privately derived from C, then it should not have an access to any of the A, B or C. 

public/public/private: 
As D is privately derived from C, then it should not have an access to any of the A, B or C. 

下面是从低于该检查结果的答案代码,

#define X public 
#define Y private 
#define Z private 

class A { 
public: int public_a; 
protected: int protected_a; 
private: int private_a; 
}; 

class B : X A { 
public: int public_b; 
protected: int protected_b; 
private: int private_b; 
}; 

class C : Y B { 
}; 

class D : Z C { 
public: 
    void test_inheritance_visibility() 
    { 
     int foo; 
     foo = public_a; 
     foo = protected_a; 
     foo = private_a; 
     foo = public_b; 
     foo = protected_b; 
     foo = private_b; 
    } 
}; 

希望我已经解释过clearly.Please帮我在清理我的concept.Thanks

+1

这个问题很难理解,你能说清楚吗?基本规范中的访问说明符控制派生到基本转换的可访问性。如果'A'具有公共成员,那么无论继承路径如何,都可以从'D'成员访问它们。无法访问的是将'this'转换为_cv_-'A *',如果它是需要访问的'this'的成员。没有看到示例代码,不清楚蜱和十字会代表什么。 – 2011-04-17 10:19:11

+0

前三列用于A类,其他三列用于B类。支票和交叉表示D类对A和B类的访问。 – 2011-04-17 10:43:54

+0

@Charles:如果A具有公共成员并且B是私人继承的C和D是否相互关联,那么D如何访问A的私有成员?当A被私下继承时,它的所有公共成员都变为私有的 – 2011-04-17 11:20:44

回答

4

下面的代码提供了一种方法来测试作业问题的继承规则。

#define inherit_A public  A 
#define inherit_B private B 
#define inherit_C private C 

class A { 
public: int public_a; 
protected: int protected_a; 
private: int private_a; 
}; 

class B : inherit_A { 
public: int public_b; 
protected: int protected_b; 
private: int private_b; 
}; 

class C : inherit_B { 
}; 

class D : inherit_C { 
public: 
    void test_inheritance_visibility() 
    { 
     int foo; 
     foo = public_a; 
     foo = protected_a; 
     foo = private_a; 
     foo = public_b; 
     foo = protected_b; 
     foo = private_b; 
    } 
}; 

剪切和粘贴上面的代码到一个名为,比如说,test.cpp文件,然后尝试编译它。编译器报告的错误消息将指示表中一行的继承可见性规则。然后在文件的开头更改#define,并重新编译它以检查表的另一行。

当我这样做(在Linux上使用G ++编译器),编译器错误,表示自己是不正确为表的第二行,但正确该表的倒数第二行。

我不主张理解这些测试结果。特别是,我认为你是正确的这两个表中的行(我没有打扰检查没有红色标记的行)。我对Als的答案的阅读也表明,对于那些有红色标记的线条,你应该是正确的。

无论如何,至少你现在有一些简单的代码,你可以带给你的老师让你有更深入的关于继承可视性的讨论。

+1

对于那个简单的测试用例。 :)虽然定义会小心,因为你也有一个'int x'小写。 ;) – Xeo 2011-04-17 10:55:46

+0

@Xeo,感谢您的反馈。我编辑了代码,将'x'重命名为'foo'。 – 2011-04-17 11:02:38

+0

嘿,我宁愿将定义更改为'#define inherit_A public A'等等。但是那也没关系。 :) – Xeo 2011-04-17 11:06:21

2

访问Specifers和继承规则可以简单地概括为:

  1. 公有继承
    Base所有Public members成为Derived classPublic members
    Base所有Protected members成为Derived class
  2. 保护继承Protected members
    Base Class所有Public & Protected members成为Protected membersDerived class
  3. 私有继承
    Base Class所有public & protected members成为Derived ClassPrivate members
  4. Private MembersBase class是继承,但never accessibleDerived Class

您可能想要参考一个previous answer,其中解释了上述概念与示例。

至于答案你问的具体问题,这个问题本身也不是很清楚,所以无法明确回答。如果你能澄清这个问题就越能回答的问题,或者是能够理解的概念,并提到的链接,然后我相信你将能够自己解决的问题。

+0

感谢您的解释。我已经解释了更多。你能帮我吗? – 2011-04-17 11:21:46

3

让我们把它卷起来: 首先,Z是什么都没有关系。如果您的D继承自C类,则无论是public,private还是protected,D都可以获得完整的接口。只有D的“孩子”才会担心这一点。

并且publicprotected成员之间并没有真正的区别,只要能够访问子孙就可以了。 private部分与人类一样,都是私密的,不是界面的一部分,只是非常接近friends而且永远不会与后代分享!

对于B类在d无障碍只有Y是有趣: C:Y B

Ÿ告诉你什么C GET的后裔:民营:没什么,保护:接口齐全,市民:接口齐全。

其中在第3行

第7行解决您的问题是一种奇怪的,因为它似乎是完全正确的。你确定这些十字架不属于那里吗?

要访问A在D中的接口,X和Y必须是宽容的(保护或公共的)。

+0

所有的蓝色答案是真实的,红色的是错误的:)感谢您的解释:) – 2011-04-17 11:35:50

+0

+1为您解释表中的第3行。当我使用我在答案中提供的测试代码时,Linux上的G ++ 4.4.1编译器同意你的分析,表中第3行的红色标记是合理的,但不是第7行中的红色标记。法赫德说他的编译器的结果就像教师标记的那样。因此,我们有两个不同意继承可见性规则的编译器。我怀疑某处有编译器错误。 – 2011-04-17 12:34:52

+0

鉴于第7行显然是公共/公共/私人,那么第3行的解释也适用于第7行,唯一的区别是,现在还有A成员可以由于公众对B的访问而被访问。也许你可以更新你的答案以反映更新 – ChrisWue 2011-04-18 06:25:23