解决继承问题的问题

时间:2011-04-17 10:04:45

标签: c++ oop inheritance

我试图解决以下测验。标记为蓝色的答案是正确的,标记为红色的答案是错误的。据我说,如果任何一个类派生受保护,那么在层次结构中一直无法访问其内容,但我不明白为什么答案是错误的。

这是测验: enter image description here  对于X,Y和Z的以下组合,可以在D类中直接访问A类和B类的哪些类型成员。填写检查以获取辅助功能,并选择交叉以获取不可访问性。 以下是我的解决方案, 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;
    }
};

希望我已经清楚地解释过了。请帮我清除我的概念。谢谢

3 个答案:

答案 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类,那么publicprivateprotected,D获得完整的界面并不重要。只有D的“孩子”才会担心这一点。

就后代的可访问性而言,publicprotected成员之间并没有真正的区别。 private部分与人类一样,是私有的,不是界面的一部分,只有非常接近的friends感兴趣,永远不会与后代共享!

对于B类在D中的可访问性,只有Y很有趣: C:Y B

Y告诉你C的后代是什么:private:nothing,protected:完整的界面,public:完整的界面。

这解决了第3行中的问题。

第7行有点奇怪,因为它似乎是完全正确的。你确定这些十字架不属于那里吗?

要访问D中的A接口,X和Y必须是允许的(受保护或公开)。

答案 2 :(得分:2)

访问指定符和继承规则可以简单地总结如下:

  1. 公共继承 中:
    Public members的所有Base成为Public members的{​​{1}},
    Derived class的所有Protected members成为Base
  2. Protected members
  3. 受保护的继承 中:
    Derived class的所有Public & Protected members成为Base Class的{​​{1}}。
  4. 私人继承 中:
    Protected members的所有Derived class成为public & protected members的{​​{1}}。
  5. <{1}}的{​​li> Base Class是继承的,Private members中的Derived Class

    您可能想要引用一个previous answer来解释上述概念并附带示例。

    至于你要问的具体问题的答案,问题本身不是很清楚,所以不能明确回答。如果您能够更清楚地澄清问题,我们可以回答这个问题,或者如果能够理解所提到的概念和链接,那么我相信您将能够自己解决问题。