我试图解决以下测验。标记为蓝色的答案是正确的,标记为红色的答案是错误的。据我说,如果任何一个类派生受保护,那么在层次结构中一直无法访问其内容,但我不明白为什么答案是错误的。
这是测验: 对于X,Y和Z的以下组合,可以在D类中直接访问A类和B类的哪些类型成员。填写检查以获取辅助功能,并选择交叉以获取不可访问性。 以下是我的解决方案,
红色中的答案不正确。以下是我的解释,
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;
}
};
希望我已经清楚地解释过了。请帮我清除我的概念。谢谢
答案 0 :(得分: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 :(得分:3)
让我们反向翻身:
首先,Z是什么并不重要。如果你的D继承自C类,那么public
,private
或protected
,D获得完整的界面并不重要。只有D的“孩子”才会担心这一点。
就后代的可访问性而言,public
和protected
成员之间并没有真正的区别。 private
部分与人类一样,是私有的,不是界面的一部分,只有非常接近的friends
感兴趣,永远不会与后代共享!
对于B类在D中的可访问性,只有Y很有趣: C:Y B
Y告诉你C的后代是什么:private:nothing,protected:完整的界面,public:完整的界面。
这解决了第3行中的问题。
第7行有点奇怪,因为它似乎是完全正确的。你确定这些十字架不属于那里吗?
要访问D中的A接口,X和Y必须是允许的(受保护或公开)。
答案 2 :(得分:2)
访问指定符和继承规则可以简单地总结如下:
Public members
的所有Base
成为Public members
的{{1}},Derived class
的所有Protected members
成为Base
Protected members
Derived class
的所有Public & Protected members
成为Base Class
的{{1}}。Protected members
的所有Derived class
成为public & protected members
的{{1}}。Base Class
是继承的,Private members
中的Derived Class
。
醇>
您可能想要引用一个previous answer来解释上述概念并附带示例。
至于你要问的具体问题的答案,问题本身不是很清楚,所以不能明确回答。如果您能够更清楚地澄清问题,我们可以回答这个问题,或者如果能够理解所提到的概念和链接,那么我相信您将能够自己解决问题。